2

je les modèles suivants, Art et ArtScore:django: plage horaire requête globale basée

class Art(models.Model): 
    title = models.CharField() 

class ArtScore(models.Model): 
    art = models.ForeignKey(Art) 
    date = models.DateField(auto_now_add = True) 
    amount = models.IntegerField() 

Certaines actions utilisateur entraîne une entrée de ArtScore, par exemple chaque fois que vous cliquez sur «J'aime cet art », je sauve une certaine quantité d'ArtScore pour cet Art.

Maintenant, j'essaie d'afficher une page pour «le plus populaire cette semaine», j'ai donc besoin d'une requête regroupant uniquement les montants ArtScore pour cette période.

J'ai construit la requête ci-dessous, mais il est défectueux ...

popular = Art.objects.filter(
    artscore__date__range=(weekago, today) 
).annotate(
    score=Sum('artscore__amount') 
).order_by('-score') 

... car il exclut seulement l'art qui ne dispose pas d'un record ArtScore dans la plage de dates, mais n'exclut pas la ArtScore enregistrements en dehors de la plage de dates.

N'importe quel pointeur comment accomplir ceci serait apprécié!

Merci,

Martin

Répondre

4

il ressemble selon ceci: http://docs.djangoproject.com/en/dev/topics/db/aggregation/#order-of-annotate-and-filter-clauses ce que vous avez devrait faire ce que vous voulez. la documentation est-elle incorrecte? bug peut-être?

"la deuxième requête inclura seulement bons livres dans le nombre annoté."

en ce qui concerne:

>>> Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book')) 

changer ceci à votre requête (oublier l'ordre pour l'instant):

Art.objects.filter(
    artscore__date__range=(weekago, today) 
).annotate(
    score=Sum('artscore__amount') 
) 

maintenant, nous pouvons dire

« la La requête inclura seulement les artscores dans la plage de dates dans leannotésomme. "

+0

vous avez raison, ça marche il s'avère ...! Merci! – Hoff

Questions connexes