Comment rendre le champ plusieurs-à-plusieurs facultatif dans Django?

202

Lorsque vous avez une relation plusieurs-à-plusieurs ( related_name, pasthrough ) et que vous essayez d'utiliser l'interface d'administration, vous devez entrer l'une des relations même si elle ne doit pas exister pour que vous puissiez créer la première entrée.

Je crée une application qui est un organisateur d'événements. Imaginez que nous avions Eventet des Groupmodèles, liés par une relation plusieurs à plusieurs.

Django related_namecrée une autre table avec les index des deux autres tables.
Mais je ne vois aucune raison pour laquelle cette table supplémentaire doit être remplie.

Si je travaille avec la base de données via phpMyAdmin, je peux créer un Groupsans enregistrer un Event, car la connexion entre les deux se fait uniquement via une table distincte et il n'y a pas d'application de la valeur de la base de données au niveau donné.

Comment puis-je faire en sorte que l'interface d'administration s'en rende compte?
Comment rendre le champ plusieurs-à-plusieurs facultatif dans Django?

DZ.
la source

Réponses:

348

Si vous voulez pouvoir spécifier la relation ManyToMany sans la rendre obligatoire, utilisez simplement blank=True:

class Group(models.Model):
    ...
    events = models.ManyToManyField(Event, blank=True)
Ludwik Trammer
la source
7
Cela résout le problème. L'utilisation du blanc n'était pas aussi évident pour moi parce que je pensais que manytomany a créé une table qui relie les événements avec les groupes (events = models.ManyToManyField (Event, related_name = "groups", blank = True) Donc ce n'était pas clair à utiliser le blanc puisque l'événement n'est pas en fait un champ dans la table de groupe. Quoi qu'il en soit, cela a fonctionné donc merci !!!
DZ.
9
@omouse Je pense que oui, vide est pour la validation django et nul pour la base de données. Dans ce genre de cas (comme pour IntegerField) cela n'a aucun sens de mettre l'un sans l'autre je pense
lajarre
17
En avez-vous vraiment besoin null=True? J'avais l'impression que nullcela n'avait aucun effet sur les ManyToManychamps: stackoverflow.com/questions/18243039/…
Tyler Hayes
5
Ouais, euh @TylerHayes a raison. null = True est fondamentalement un no-op et n'a pas de sens dans le contexte d'un ManyToMany. Je suis ouvert à ce que je me trompe.
Ben Roberts
7
null = True n'est pas requis, au moins à partir de Django 1.5.
Ville Laurikari