2012-06-26 8 views
48

Angenommen, ich habe dieses Modell:Kann ich einen Fremdschlüssel für dasselbe Modell in Django erstellen?

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

Nun möchte Ich mag, dass eine Aufgabe auf eine andere Aufgabe bezieht sein kann. Also wollte ich das tun:

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

aber ich habe einen Fehler, der angibt, dass Aufgabe ist Notiz definiert. Ist das "legal", wenn nicht, wie soll ich etwas Ähnliches tun?

+0

Wenn Sie nicht wollen, 'relates_to' an sich selbst zu verknüpfen, sehen http://stackoverflow.com/q/37946885/247696 – Flimm

Antwort

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

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

+1

genau nur ein paar Sekunden schneller :-) –

+0

Gute Idee mit der Verwendung von' Selbst "statt" Aufgabe "! –

+1

Angenommen, ich verwende so etwas und möchte Aufgaben löschen. Da jede Aufgabeninstanz einen Fremdschlüssel zu einer anderen Aufgabeninstanz hat, löscht Django automatisch eine Kaskadenlöschung, wenn ich eine Aufgabeninstanz lösche, so dass automatisch jede Aufgabeninstanz gelöscht wird, die auf die gerade gelöschte Aufgabe verweist. Mit anderen Worten, arbeitet CASCADE DELETE immer noch im selben Modell? – Marc

15

Yea Sie das tun können, die ForeignKey machen Attribut einen String:

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

In Tiefe, können Sie auch Querverweis eines Modells App durch die Punktnotation, z.B.

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