2016-01-29 1 views
2

I ont les 2 modèles Django suivants:Comment parcourir un Django ManyToManyField dans un ordre trié?

from django.db import models 

class B(models.Model): 
    name = models.CharField(null=False, blank=False, max_length=255) 

    def __str__(self): 
     return self.name 


class A(models.Model): 
    name = models.CharField(null=False, blank=False, max_length=255) 
    b = models.ManyToManyField(B, related_name="A_b") 

Je crée les cas suivants:

p = B.objects.create(name="P") 
q = B.objects.create(name="Q") 
r = B.objects.create(name="R") 
f = A.objects.create(name="F") 
f.add(r) 
f.add(q) 
f.add(p) 
f.save() 

Maintenant, quand j'itérer le Bs sur f, je reçois le texte suivant:

>>> [i for i in f.b.iterator()] 
['R', 'Q', 'P'] 

Comment parcourir les objets B associés à f tels que ils apparaissent dans l'ordre alphabétiquement trié ??

Répondre

2

Je ne sais pas s'il y a d'autres approches, mais ce que je fais habituellement est de profiter de la model Meta.ordering comme:

class B(CachingMixin, MPTTModel): 
    name = models.CharField(null=False, blank=False, max_length=255) 

    class Meta: 
     ordering = ['name'] 
+1

Cela a fonctionné! Merci. J'accepterai la réponse dès qu'elle me le permettra. :) –

3

objets connexes sont QuerySets. Ainsi vous pouvez commander par n'importe quel domaine que vous aimez:

f.b.order_by('name') 
+0

BTW Daniel, je ne savais pas que l'on pouvait ajouter directement à l'objet 'f.add (r)' en ignorant le champ 'f.b.add (r)'. Est-ce exact? Et je n'avais jamais vu '.iterator()' non plus – Pynchia