2009-07-12 20 views
10
class Achievement(MyBaseModel): 
    parent_achievement = models.ForeignKey('self', blank=True, null=True, help_text="An achievement that must be done before this one is achieved") # long name since parent is reserved 

que puedo hacer:Django: Cómo seguir ForeignKey ('yo') hacia atrás

Achievement.objects.get(pk="1").parent_achievement 

que es grande. Pero, ¿cómo consigo a todos los niños?

Achievement.objects.get(pk="1").parent_achievement_set 

no funciona (y probablemente debería tener un poco más de notación alrededor de ella), y yo no ver demasiado cuando se busca.

¿Es posible? ¿Caer en SQL?

Respuesta

16

Por defecto, Django llamar a la inversa el nombre del modelo, seguido de "_ID", por lo que sería

Achievement.objects.get(pk="1").achievement_set 

Si eso no le conviene, utilice el argumento opcional related_name a models.ForeignKey:

class Achievement(MyBaseModel): 
    parent_achievement = models.ForeignKey(
     'self', 
     blank=True, 
     null=True, 
     help_text="An achievement that must be done before this one is achieved", 
     related_name="child_achievement_set" 
    ) # long name since parent is reserved 

Achievement.objects.get(pk="1").child_achievement_set 
+7

wonderful. Funcionó muy bien. compraría de nuevo. A ++ –

1

no sabemos si esta es la mejor manera, pero esto también hace el trabajo

Achievement.objects.filter(parent_achievement=1) 

o

Achievement.objects.filter(parent_achievement__pk=1)