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
a = A(name='asdfdf') # here we must fill in content_type
- por
QuerySet
máquinas con*args
tupla. En este caso no hay que rellenarcontent_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?
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. –
No quiero que sea opcional, simplemente no quiero establecer su valor si ya lo ha configurado Django (en el proceso de lectura desde DB). –