45 votes

Définir une commande pour ManyToManyField avec Django

Existe-t-il un moyen de définir l'ordre des objets liés via un ManyToManyField ?

Exemple:

  • ArticleContainer1 contient dans cet ordre : article1, article2, article3, article6

  • ArticleContainer2 contient dans cet ordre : article3, article2, article1, article4

  • ArticleContainer3 contient dans cet ordre : article5

Voici mes cours :

 class Article(models.Model):    
    title = models.CharField(max_length=200)

class ArticleContainer(models.Model):
   contents = models.ManyToManyField(Article, blank=True, null=True)

14voto

Voir les docs à travers .

11voto

astevanovic Points 2983

Si vous utilisez un through explicitement défini pour la relation m2m, vous pouvez ajouter votre propre attribut order-id . Ensuite, vous pouvez étendre ManyToManyField pour remplir l'ID de commande selon votre logique lors de la création/mise à jour et un gestionnaire de modèle m2m qui triera les résultats lorsque vous les récupérerez par l'attribut order-id.

6voto

jeromecc Points 80

Sur Django 2.0, la réponse acceptée de Francis Yaconiello fonctionne bien à l'exception d'un avertissement causé par l'argument max_length pour le order de la classe DepartmentPeople .

Django ignore max_length pour les champs entiers et vous avertira dans Django 1.8+.

J'ajouterais une entrée unique_together dans la sous-classe Meta

 class Meta:
    #...
    unique_together = ['person', 'department', 'order']

pour éviter les erreurs de saisie des données.

1voto

Herrgott Points 201

J'utilise ce plugin : https://github.com/jazzband/django-sortedm2m
Cela fonctionne très bien
J'ai eu quelques problèmes avec les migrations car je n'avais pas lu l'utilisation du plugin, faites attention

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X