2017-02-04 3 views
2

J'ai ce modèle:Django related_name pas trouvé

class Person(models.Model): 
    something ... 
    employers = models.ManyToManyField('self', blank=True, related_name='employees') 

Quand je person.employees.all() je reçois cette erreur: 'Person' object has no attribute 'employees'. Est-ce que le nom associé est créé uniquement lorsqu'il existe un lien réel? Si oui, comment puis-je vérifier cela?

EDIT: Je connais la fonction hasattr(). Je me demande toujours pourquoi l'attribut ne renvoie pas une liste vide lorsqu'il n'y a pas d'objets connexes.

Répondre

3

Pour utiliser related_name avec plusieurs-à-plusieurs récursifs, vous devez définir symmetrical=False. Sans cela, Django n'ajoutera pas l'attribut employees à la classe. De l'docs:

When Django processes this model, it identifies that it has a ManyToManyField on itself, and as a result, it doesn’t add a person_set attribute to the Person class. Instead, the ManyToManyField is assumed to be symmetrical – that is, if I am your friend, then you are my friend.

Vous pouvez ajouter symmetrical=False au champ:

employers = models.ManyToManyField('self', blank=True, related_name='employees', symmetrical=False) 

person.employees.all() # will work now 

ou tout simplement utiliser employers attribut:

person.employers.all() 
+1

Merci un bouquet! – rwms