web-dev-qa-db-fra.com

Django Plusieurs-à-plusieurs (m2m) Relation avec le même modèle

Je voudrais créer une relation plusieurs-à-plusieurs depuis et vers un objet de classe utilisateur.

J'ai quelque chose comme ça:

class MyUser(models.Model):
    ...
    blocked_users = models.ManyToManyField(MyUser, blank=True, null=True)

La question est de savoir si je peux utiliser la référence de classe en elle-même. Ou dois-je utiliser "self" au lieu de "MyUser" dans le ManyToManyField? Ou existe-t-il une autre (et meilleure) manière de procéder?

43
Ron

Techniquement, je suis presque sûr que "MyUser" ou "self" fonctionnera, tant qu'il s'agit d'une chaîne dans les deux cas. Vous ne pouvez tout simplement pas transmettre MyUser, la classe réelle.

Cependant, les documents utilisent toujours "self". L'utilisation de "self" est non seulement plus explicite sur ce qui se passe réellement, mais elle est imperméable aux changements de nom de classe. Par exemple, si vous avez ultérieurement modifié MyUser en SomethingElse, vous devrez également mettre à jour toute référence à "MyUser". Le problème est que puisqu'il s'agit d'une chaîne, votre IDE ne vous alertera pas sur l'erreur, donc il y a plus de chances que vous la manquiez. L'utilisation de "self" fonctionnera quelle que soit la classe ' nom est maintenant ou à l'avenir.

66
Chris Pratt
class MyUser(models.Model):
    ...
    blocked_users = models.ManyToManyField("self", blank=True)
40
Goin

n'utilisez pas 'self' dans ManyToManyField, cela vous obligera à vous lier les uns aux autres, lorsque vous utilisez le formulaire Django pour le soumettre)

class Tag(models.Model):
    ...
    subTag = models.ManyToManyField("self", blank=True)

 ...
 aTagForm.save()

et résultat:

 a.subTag == b
 b.subTag == a
0
ruandao