2012-06-26 13 views
48

Supongamos que tengo este modelo:¿Puedo hacer una claveexterna al mismo modelo en django?

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

Ahora me gustaría que una tarea puede ser relacionada con otra tarea. Así que quería hacer esto:

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

Sin embargo, tengo un error que indica que Tarea es nota definida. ¿Es esto "legal", si no, cómo debería hacer algo similar a eso?

+0

Si no desea que 'relates_to' para enlazar a sí mismo, ver http://stackoverflow.com/q/37946885/247696 – Flimm

Respuesta

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

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

+1

exactamente Pocos segundos más rápido :-) –

+0

buena idea con el uso de' self' en lugar de 'Task'! –

+1

Supongamos que uso algo como esto y quiero eliminar tareas. Como cada instancia de la tarea tiene una clave externa en otra instancia de la tarea, si elimino una instancia de la tarea, Django eliminará en cascada automáticamente para que elimine automáticamente cualquier instancia de la tarea que apunte a la tarea que acabo de eliminar. En otras palabras, ¿CASCADE DELETE aún funciona dentro del mismo modelo? – Marc

15

Sí se puede hacer eso, hacer el ForeignKey atribuyen una cadena:

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

En profundidad, puede hacer referencia también cruz el modelo de una aplicación usando la notación de puntos, por ejemplo,

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