ho il seguente modello:Django: Verificare se l'attributo chiave esterna è impostato
class A(models.Model):
name = models.CharField(max_length=50)
content_type = models.ForeignKey(ContentType)
Questo modello si suppone che sia il modello di radice in qualche attributo albero di ereditarietà e content_type è una sorta di un suggerimento su quale tipo è davvero memorizzato. Ovviamente, dovrei calcolare content_type
in modo trasparente sulla creazione di un'istanza. Penso, in __init__
. Ma c'è un problema - ci sono due contesti principali in cui vengono create le istanze:
a = A(name='asdfdf') # here we must fill in content_type
- di
QuerySet
macchinari con*args
tuple. In questo caso non dovrei compilarecontent_type
Quindi, sto cercando di scrivere:
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 è self.content_type
è ReverseSingleRelatedObjectDescriptor
un'istanza con __get__
sovrascritto in modo che getta in valore caso è non impostato. Sì, posso fare quanto segue:
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)
Ma non mi piace. C'è un modo più "educato" per verificare se l'attributo ForeignKey
è impostato?
Innanzitutto, se vuoi che content_type' sia facoltativo, penso che dovrai impostare 'blank = True, null = True' sulla definizione del tuo campo. –
Non voglio che sia opzionale, ma non voglio impostarne il valore se è già stato impostato da Django (nel processo di lettura dal DB). –