2010-01-05 10 views
10

tengo el siguiente modelo:Django: Comprobar si el atributo de clave externa se establece

class A(models.Model): 
    name = models.CharField(max_length=50) 
    content_type = models.ForeignKey(ContentType) 

Este modelo se supone que es el modelo de la raíz en algún atributo árbol de herencia y content_type es una especie de una pista acerca de qué tipo esta realmente almacenado Obviamente, debería calcular content_type de forma transparente al crear una instancia. Creo que, en __init__. Pero hay un problema - hay dos contextos principales en los que se crean instancias: A

  1. a = A(name='asdfdf') # here we must fill in content_type
  2. por QuerySet máquinas con *args tupla. En este caso no hay que rellenar content_type

lo tanto, estoy tratando de escribir:

def __init__(self, *args, **kwargs): 
    super(A, self).__init__(*args, **kwargs) 
    if self.content_type is None: # << here is the problem 
     self.content_type = ContentType.objects.get_for_model(self) 

La cosa es self.content_type es ReverseSingleRelatedObjectDescriptor ejemplo, con __get__ anulado por lo que arroja un valor caso es no establecido. Sí, puedo hacer lo siguiente:

def __init__(self, *args, **kwargs): 
    super(A, self).__init__(*args, **kwargs) 
    try: 
     self.content_type 
    except Exception, v: 
     self.content_type = ContentType.objects.get_for_model(self) 

Pero no me gusta. ¿Hay una forma más "cortés" de verificar si el atributo ForeignKey está configurado?

+0

En primer lugar, si quiere que 'content_type' sea opcional, creo que deberá establecer' blank = True, null = True' en la definición de su campo. –

+1

No quiero que sea opcional, simplemente no quiero establecer su valor si ya lo ha configurado Django (en el proceso de lectura desde DB). –

Respuesta

29

¿Funciona si examina self.content_type_id en lugar de self.content_type?

+0

Sin duda, tienes razón. Es exactamente lo que necesito. Gracias. –

Cuestiones relacionadas