django - snippet - title tag




Wie verwendet man Django ORM, um eine Liste aller Artikel mit einer Artikelanzahl nach Jahren zu erhalten (2)

Hier ist eine Möglichkeit, dies in einer Abfrage zu tun:

Article.objects.extra(select={'year':"strftime('%%Y',created)"}).values('year').order_by().annotate(Count('id'))

Beachten Sie, dass Sie strftime('%%Y',created) entsprechend Ihrer Datenbank ersetzen strftime('%%Y',created) (ich benutzte sqlite).

Ich versuche, das django ORM zu verwenden, um eine Liste aller Artikel mit einer Artikelanzahl neben dem Jahr zu erhalten, wie z.

2010 (5 Artikel)
2009 (4 Artikel)
2008 (9 Artikel)

Ich habe versucht, Dinge wie:

archive = Articles.objects.dates ('erstellt', 'Jahr') annotieren (archive_count = Anzahl ('erstellt'))

oder:

archive = Articles.objects.values ​​('erstellt'). annotieren (archive_count = Anzahl ('erstellt'))

oder:

archive = Articles.objects.values ​​('erstellt'). aggregate (archive_count = Anzahl ('erstellt'))

Das letzte gab mir die richtige Anzahl, aber gab mir keine der Jahreswerte, die anderen geben eine Mischung aus entweder nothing oder archive_count, die für jede Zeile auf 1 gesetzt sind.

Irgendwelche Ideen, wo ich falsch liege?


Ich bin mir nicht sicher, ob es das Hauptziel ist, Datenbanktreffer auf ein Minimum zu beschränken. Wenn ja, könnte es einen anderen Weg geben, den ich nicht berücksichtigt habe. Aber auf den ersten Blick sieht das so aus, wie Sie wollen:

archive={}
years = Article.objects.dates('created', 'year')
for year in years:
    archive[year.year] = Article.objects.filter(created__year=year.year).count()

Dann haben Sie ein Wörterbuch mit {2010: 5, 2009: 4, 2008: 9}.





django-views