11 Stimmen

Filtern nach Anzahl mit dem Django ORM

Ich habe eine Abfrage, die im Grunde ist "zählen alle Elemente des Typs X, und geben Sie die Elemente, die mehr als einmal vorhanden sind, zusammen mit ihrer Anzahl". Im Moment habe ich dies:

Item.objects.annotate(type_count=models.Count("type")).filter(type_count__gt=1).order_by("-type_count")

aber es gibt nichts zurück (die Anzahl ist 1 für alle Elemente). Was mache ich falsch?

Im Idealfall sollte sie Folgendes erhalten:

Type
----
1
1
2
3
3
3

und zurück:

Type, Count
-----------
1     2
3     3

0 Stimmen

Ich könnte, aber der relevante Teil ist nur, dass es ein "Item"-Modell mit einem "Type"-Feld gibt...

25voto

Daniel Roseman Punkte 565786

Um die Anzahl der Vorkommen eines jeden Typs zu zählen, müssen Sie nach dem type Bereich. In Django wird dies durch die Verwendung von values um genau dieses Feld zu erhalten. Dies sollte also funktionieren:

Item.objects.values('group').annotate(
     type_count=models.Count("type")
).filter(type_count__gt=1).order_by("-type_count")

0 Stimmen

Ja - das ist richtig, aber verwenden Sie type anstelle von group :) es wird etwas zurückgegeben wie: [{'type': u'X', 'type_count': 2}] - warum habe ich das nicht früher gesagt :)

0 Stimmen

Ich glaube, Sie meinten "Typ" und nicht "Gruppe", es hat Arbeit, wenn ich dies ohne die __gt Teil, aber mit der __gt Teil wirft es nur "dict Objekt hat kein Attribut type_count", die mir sagt, dass es versucht, es als eine Spalte zugreifen...

0 Stimmen

Das ist seltsam - ich habe es überprüft und es funktioniert wie ein Charme. Btw. wenn er sagt, dass es kein type_count attr in dict gibt, meint er das dict, das vom Aggregat generiert wird - er versucht nicht, darauf wie auf eine Spalte zuzugreifen. Die Ergebnisse sollten so sein, wie ich oben geschrieben habe. Überprüfen Sie es in Django Shell, um sicher zu sein.

3voto

bx2 Punkte 6040

Das ist ein logischer Fehler ;)

type_count__gt=1 bedeutet type_count > 1 Wenn also die count == 1 es wird nicht angezeigt :) verwenden type_count__gte=1 stattdessen - bedeutet es type_count >= 1 :)

0 Stimmen

Ja, aber du hast gesagt, dass die Anzahl 1 für jeden ist - das ist der Grund, warum nichts angezeigt wird :)

0 Stimmen

Es gibt doppelte Typen, aber die Zählung für alles ist 1. Das ist falsch, aber ich weiß nicht, warum die Zählung nicht richtig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X