Question

Je cherche quelque chose comme ce qui suit:

previous_invoices = Invoice.objects.filter(is_open=False)
                                   .order_by('-created')
                                   .group_by('user')

mais group_by() n'existe pas ...

trouverait la facture plus récemment fermé pour chaque utilisateur.

semble vous laisser faire des choses comme cela pour compte et sommes, mais je ne pas besoin d'un nombre ou d'une somme ou quoi que ce soit, je veux réellement les objets de facture!

Était-ce utile?

La solution

Option 1:

Bien qu'un group_by() n'existe pas dans Django, vous pouvez essayer de travailler autour de récupérer la facture plus récemment fermé pour chaque utilisateur en utilisant méthode latest() et filtre pour un utilisateur ainsi:

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
                                   .latest('created') 

Pour les anciennes versions de Django ont été latest() n'existe pas, la requête ressemblera à ceci:

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
                                   .order_by('-created')[0]

Option 2:

Si vous voulez absolument créer les effets d'un group_by, alors vous créez un manuellement un comme indiqué dans la réponse acceptée ici: Django GROUP BY valeur du champ .

  
      
  1. Utilisez .values_list() avec flat=True pour obtenir une liste des valeurs existantes dans votre base de données (si vous ne les connaissez pas à l'avance). Utilisez également .distinct() pour elimintae les valeurs en double que nous ne nous soucions pas pour ceux:

    value_list = MyModel.objects.values_list(
        'interesting_field', flat=True
    ).distinct()
    
  2.   
  3. itérer value_list et remplir votre dictionnaire:

    group_by_value = {}
    for value in value_list:
        group_by_value[value] = MyModel.objects.filter(interesting_field=value)
    
  4.   
     

dictionnaire maintenant group_by_value contient comme clés les valeurs distinctes   dans votre interesting_field et que les valeurs des objets QuerySet, chaque   contenant les entrées de MyModel avec interesting_field=a value from value_list.


Remarque:

Il existe cette bibliothèque django-groupe par qui prétend ajouter un group_by() sur Django vous pouvez vouloir vérifier.

Autres conseils

Il y a cette page à partir de 2007 qui piraté à django, mais ce serait sans objet puisque avant 1.1 ne dispose d'une group_by` non documentée de toute façon. Mais ce fil il y a un an semble avoir quelques idées . Essentiellement:

  

Django ne pas exposer intentionnellement « GROUP BY » ou quelque chose comme ça, en   l'ORM. Bien que le fait que nous sommes   sur un arrière-plan de stockage relationnel   fuites parfois à travers, l'API ORM   est assez SQL agnostique. Au lieu de cela, nous   exposer des éléments particuliers de   fonctionnalité qui se trouvent être   mis en œuvre en utilisant « GROUP BY » quand il est   transformé en SQL (et pourrait bien être   mis en œuvre par une tout autre   un ensemble de fées magiques avec   backend différent du système de stockage).

Voir aussi les mentions de l'utilisation extra, et aussi les moyens magiques dans lesquels que peut échouer. Bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top