6
votes

Annotations conditionnelles à Django

J'ai obtenu une nécessité simple (non simple implémentation) et déterminer comment y parvenir sans faire de multiples hits à dB, et sans .extra () code> en queryset.

Task:
  name = xxx
  status = models.IntegerField(choices=some_choices)
  project = ForeignKey(Project)

Project:
  name = xxx
  code = xxx


3 commentaires

Comment compteriez-vous le faire avec SQL cru quand même?


Stackoverflow.com/questions/2875122/...


+1. Il est donc clair que ce type de fonctionnalité n'est pas là dans le cœur. Mais, est-ce que nous pouvons y parvenir en utilisant f () etc.?


3 Réponses :


0
votes

Si cela ne vous dérange pas de requêtes supplémentaires, vous pouvez dériver deux requêtes au lieu d'un. Le premier peut vous obtenir le nombre total et la seconde filtrage sur TaskS_Status CODE> et vous obtenez ainsi le nombre complété.

from django.db.models import Count
all_projects = Project.objects.all()
total_counts = all_projects.annotate(count = Count('tasks'))
completed_counts = all_projects.filter(tasks_status = 3).annotate(count = Count('tasks'))


2 commentaires

Ceci est un peu mieux que mon approche brute, où je suis itération de tous les projets et de la queyyset attachée pour obtenir complété_counts. Mais, cela nous oblige encore à faire correspondre le projet vs Tallounts_Counts, peut être dans le modèle ou visualiser


D'accord. Vous êtes obligé de faire correspondre le projet contre le compte dans le modèle ou la vision.



0
votes

Je ne sais pas si cela vous aidera, mais vous pouvez écrire vos propres objets d'annotation personnalisés. Je viens de le faire sans la partie conditionnelle. J'ai basé ma solution sur ce lien: http://www.voteruniverse.com/members/jlantz/ Blog / conditionné-agrégats-in-django

mais n'a pas utilisé l'exemple là-bas. Au lieu de cela, j'ai examiné le code Django pour les agrégats et étendit la somme et comptez les objets eux-mêmes.


1 commentaires

Je ne sais pas si le blog lié est juste en bas pour le moment ou en permanence, mais voici une version archivée dans tous les cas: web.archive.org/web/20101115170804/http://www.voteruniverse. com / ...



9
votes

1 commentaires

Beau! Réponse très bien mise à jour, merci. devrait être dans le compter docs eux-mêmes