2009-07-21 8 views
1

Je peux avoir un problème classique, mais je n'ai trouvé aucun extrait me permettant de le faire.django - Ordre récursif QuerySet par méthode

Je veux trier ce modèle par son nom complet.

class ProductType(models.Model): 
    parent = models.ForeignKey('self', related_name='child_set') 
    name  = models.CharField(max_length=128) 

    def get_fullname(self): 
     if self.parent is None: 
      return self.name 
     return u'%s - %s' % (unicode(self.parent), self.name) 
    fullname = property(get_fullname) 
  1. J'ai essayé le tri par "parent", a obtenu erreur de boucle infinie. "parent__id" n'a pas bien trié.

  2. Je ne pouvais pas comprendre comment utiliser annotate() pour concaténer des champs de chaîne.

  3. J'ai ajouté un gestionnaire personnalisé avec trié(), mais il retourne un objet de liste et empêche mon forms.ModelChoiceField travailler.

est ici le genre

def all(self): 
    return sorted(super(ProductTypeManager, self), key=lambda o: o.fullname) 

Qu'y at-il dans la jungle djangonic? Merci pour votre aide.

Répondre

0

Cela pourrait fonctionner:

ProductType.objects.alL().order_by('parent__name', 'name') 
+0

Il se comporte étrangement, comme order_by ('parent__id') l'a fait. – leplatrem

+0

Que signifie «se comporte étrangement», précisément? Pourriez-vous mettre à jour votre question avec la chose spécifique qu'elle fait mal? –

+0

Je voulais dire, il ne trient pas bien: http://pastebin.com/m3af438ac Il est connu pour être incohérent: http://code.djangoproject.com/ticket/7101#comment:1 – leplatrem

2

Je créerais probablement un champ denomalised et l'ordre sur ce point. En fonction de vos préférences, vous pourriez vouloir remplacer override(), ou utiliser un signal pour peupler le champ dénormalisé.

class ProductType(models.Model): 
    parent = models.ForeignKey('self', related_name='child_set') 
    name  = models.CharField(max_length=128) 
    full_name  = models.CharField(max_length=128*4) 

    def save(self, *args, **kwargs): 
     if not full_name: 
      self.full_name = self.get_fullname() 
     super(ProductType, self).save(*args, **kwargs) 


    def get_fullname(self): 
     if self.parent is None: 
      return self.name 
     return u'%s - %s' % (unicode(self.parent), self.name) 

Ensuite, faire une commande normale par full_name

0
.

Je voudrais certainement explorer la route que vous avez mentionné comme 1) ci-dessus:

ProductType.objects.order_by('parent__name', 'name') 

Pourquoi est-ce une erreur avec une boucle infinie? Vos données d'exemple se référencent-elles elles-mêmes?

+0

Il s'agit d'une exception Django: http://code.djangoproject.com/browser/django/trunk/django/db/models/sql/query.py?rev = 11274 # L1012 Il est rapidement expliqué ici: http://code.djangoproject.com/ticket/7101#comment:1 – leplatrem

1

Ou, si ce que vous essayez de faire est de générer une structure arborescente, jetez un oeil à django-mptt. Il permet également de commander sur un ordre défini manuellement.

Questions connexes