2012-06-26 7 views
48

Si supponga che ho questo modello:Posso creare una chiave straniera per lo stesso modello in django?

class Task(models.Model): 
    title = models.CharField() 

Ora vorrei che un compito può essere relativa ad un altro compito. Così ho voluto fare questo:

class Task(models.Model): 
    title = models.CharField() 
    relates_to = ForeignKey(Task) 

tuttavia ho un errore che afferma che Task è nota definita. È questo "legale", se no, come dovrei fare qualcosa di simile a quello?

+0

Se non si desidera 'relates_to' collegare a se stessa, vedere http://stackoverflow.com/q/37946885/247696 – Flimm

risposta

93
class Task(models.Model): 
    title = models.CharField() 
    relates_to = models.ForeignKey('self') 

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

+1

esattamente Pochi secondi più veloce :-) –

+0

Buona idea con l'utilizzo di' self' invece di 'Task'! –

+1

Supponiamo che io usi qualcosa come questo e voglio cancellare Attività. Dal momento che ogni istanza di Task ha una chiave straniera a un'altra istanza di Task, se elimino un'istanza di Task Django eliminerà automaticamente le eliminazioni in cascata in modo da eliminare automaticamente qualsiasi istanza di Task che punta all'attività che ho appena eliminato? In altre parole, CASCADE DELETE funziona ancora all'interno dello stesso modello? – Marc

15

Yea si può fare, fare il ForeignKey attribuiscono una stringa:

class Task(models.Model): 
    title = models.CharField() 
    relates_to = ForeignKey('Task') 

in profondità, è possibile fare riferimento anche croce modello di un'applicazione utilizzando la notazione del punto, per esempio

class Task(models.Model): 
    title = models.CharField() 
    relates_to = ForeignKey('<app_name>.Task') # e.g. 'auth.User' 
Problemi correlati