2010-01-05 20 views
10

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:

  1. a = A(name='asdfdf') # here we must fill in content_type
  2. di QuerySet macchinari con *args tuple. In questo caso non dovrei compilare content_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?

+0

Innanzitutto, se vuoi che content_type' sia facoltativo, penso che dovrai impostare 'blank = True, null = True' sulla definizione del tuo campo. –

+1

Non voglio che sia opzionale, ma non voglio impostarne il valore se è già stato impostato da Django (nel processo di lettura dal DB). –

risposta

29

Funziona se si esamina self.content_type_id anziché self.content_type?

+0

Certo, hai ragione. È esattamente ciò di cui ho bisogno. Grazie. –

Problemi correlati