2016-04-03 4 views
0

ich für Benutzeraktivitäten Aktivitätsprotokolle haben, im Grunde wie folgt strukturiert:Django - Aggregate gleiche Werte von Feldern in Modell

class ActivityLog(TimeStampedModel): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    action_type = models.CharField(max_length=25) 
    object_raw = models.CharField(max_length=500) 

ich alle Einträge aggregieren möchten, wo object_raw entspricht, das heißt also, wenn ein Benutzer gesucht 'foo' bei 4 verschiedenen Gelegenheiten, bekomme ich einen Eintrag für 'foo' zurück, mit count = 4. Ich habe gerade Probleme damit. Ich weiß, wie man es in SQL macht, aber verstehe diese Django-Syntax nicht. Ich habe die Dokumente gelesen, aber ich verstehe es immer noch nicht. Wenn jemand helfen könnte, wäre es sehr geschätzt!

Antwort

0

Um ein Objekt mit 'foo' zu erhalten und wie viele Objekte object_raw='foo' haben Sie tun können:

activity_logs = ActivityLog.objects.filter(object_raw='foo') 
if activity_logs.exists(): 
    activity_logs.first() # get one object 
    activity_logs.count() # get number of objects 

Wenn Sie nur wollen, wie viele haben Objekte object_raw='foo', Sie conditional expressions mit aggregates verwenden können:

from django.db.models import IntegerField, Sum 
Client.objects.aggregate(
    num_object_raw=Sum(
     Case(
      When(object_raw='foo', then=1), 
      output_field=IntegerField() 
     ) 
    ) 
)