2

私はこのモデルを持っています:

class Person(models.Model):
   city = models.CharField(max_length=20, blank=True)
   added_date = models.DateField(default=datetime.date.today)

月の表とその月に追加された人数(つまり、1月に5人、2月に10人、3月に8人など)を含むテンプレート/ビューを作成したいと思います。私は、各都市のすべての人々のために、以下を使用して同様のテーブルを持っています。

cities = Patient.objects.values('city').annotate(city_count=Count('city')).order_by('-city_count')

月のテーブルでそれを行う方法がわかりません。特定の月をフィルタリングしてから、すべてを数えることができます。しかし、それを毎月ループで実行する必要があります。これは、複数のデータベースヒットになります。やりたくない。

SQLを記述せずにdjangoのAPIを使用するだけでこれを行う方法はありますか?

4

2 に答える 2

0

それは非常に古いスレッドですが、他の誰かが解決策を探してここにたどり着いた場合に備えて答えると思います。解決策は、Django 1.10+ で ExtractMonth 関数を使用することです。詳細については、公式ドキュメントを参照してください。

まず、次のように ExtractMonth をインポートする必要があります

from django.db.models.functions import ExtractMonth

次に、 Persons モデルを使用すると、コードは次のようになります

personsMonthlyData = Person.objects.annotate(month=ExtractMonth('added_date')).values('month').annotate(count=Count('id')).order_by('month')

peopleMonthlyData はこのようなものを出力します

[{month: 1, count: 3}, {month: 2: count: 1}]

ここで、月は月番号を表し、たとえば 1 月は 1、2 月は 2 で、各月に対するカウントがカウント項目に割り当てられます。

これが役立つことを願っています。

于 2020-01-28T07:58:14.887 に答える
-1

ほとんどの DB にはGROUP BY、Django AFAIK に類推がないクエリを使用してこれを行うための完璧な方法があるという事実は、これを行うために SQL に落とし込むことになります。「django sql」のグーグル検索を行い、この正確な問題に関する Doug Hellman によるこの投稿を見つけました: http://blog.doughellmann.com/2007/12/using-raw-sql-in-django.html。これを、月のカウントを Django に取り込むための出発点として使用します。

于 2010-09-04T19:11:14.377 に答える