Ich verwende , um Treffer auf meine Datenbankobjekte zu tally. Ich möchte die Treffer nach Objekt zählen, um zu bestimmen, welches Objekt die meisten Treffer in einem bestimmten Zeitraum hat. Die App hat zwei Modelle von Interesse hier:Kommentieren Sie in Django mit generischen Beziehungen
class Hit(models.Model):
created = models.DateTimeField(editable=False)
ip = models.CharField(max_length=40, editable=False)
session = models.CharField(max_length=40, editable=False)
user_agent = models.CharField(max_length=255, editable=False)
user = models.ForeignKey(User,null=True, editable=False)
hitcount = models.ForeignKey(HitCount, editable=False)
class HitCount(models.Model):
hits = models.PositiveIntegerField(default=0)
modified = models.DateTimeField(default=datetime.datetime.utcnow)
content_type = models.ForeignKey(ContentType,
verbose_name="content cype",
related_name="content_type_set_for_%(class)s",)
object_pk = models.TextField('object ID')
content_object = generic.GenericForeignKey('content_type', 'object_pk')
„Hit“ Protokolle jeweils mit einem Zeitstempel zu schlagen, während HitCount speichert Gesamtanzahl der Treffer. Um die Hits von Objekt zu erhalten und innerhalb eines Zeitbereichs, muss ich folgendes tun:
Nach Datum filtern Hit erstellt Count Anzahl der Treffer pro content_object (innerhalb Zeitbereich gefiltert oben) um durch Zählung berechnet über return content_object und count
Das könnte sehr teuer sein, also plane ich einmal pro Tag calcing/caching.
Als ersten Schritt wollte ich die Anzahl der Treffer pro content_object unabhängig vom Zeitbereich zählen.
limited_hc = Hit.objects.all().values('hitcount__content_object').annotate(count = Count('hitcount__object_pk'))
ich sofort in ein Problem laufen:
nicht Stichwort lösen können 'hitcount__content_object' in das Feld. Zur Auswahl stehen: created, hitcount, id, ip, session, user, user_agent
Nach etwas graben fand ich das annotation and generic relations do not work well together. Wenn ich object_pk anstelle von content_object verwende, funktioniert es gut, aber ich habe nicht den Namen des Objekts.
Also meine Frage: Was ist eine Alternative, um das gleiche Ergebnis zu erzielen? Wie kann man nach Objekten gruppieren, aber auch den Namen behalten?
Ich habe das Modell (content_type) und die ID (object_pk), also könnte ich diese immer separat ziehen, aber das scheint unelegant. . .
Keine Möglichkeit, dies jetzt zu versuchen, aber haben Sie versucht, 'limited_hc = Hit.objects.all(). Values (' hitcount__content_type ',' hitcount__object_pk '). Annotieren (count = Count (' hitcount__object_pk ')) '? –
Das funktioniert, aber ich bekomme keine Verbindung zum eigentlichen Objekt. Also ich kann den Namen nicht bekommen, nur die PK. Ich müsste dann die Datenbank erneut anpingen, um die Namensdaten aus der jeweiligen Tabelle zu holen –