51

次のようなモデルがあります。

class Review(models.Model):
    venue = models.ForeignKey(Venue, db_index=True)
    review = models.TextField()  
    datetime_created = models.DateTimeField(default=datetime.now)

データベースにクエリを実行して、日ごとにグループ化された会場の総レビュー数を取得したいと考えています。MySQL クエリは次のようになります。

SELECT DATE(datetime_created), count(id) 
FROM REVIEW 
WHERE venue_id = 2
GROUP BY DATE(datetime_created);

Djangoでこれを達成する最良の方法は何ですか? 私はただ使うことができました

Review.objects.filter(venue__pk=2)

ビューで結果を解析しますが、それは私には正しくないようです。

4

5 に答える 5

95

これは機能するはずです(使用したのと同じMySQL固有の関数を使用):

Review.objects.filter(venue__pk=2)
    .extra({'date_created' : "date(datetime_created)"})
    .values('date_created')
    .annotate(created_count=Count('id'))
于 2010-02-17T19:51:30.057 に答える
17

完全を期すために、extra() は非推奨であるため、次のアプローチを使用できます。

from django.db.models.expressions import DateTime

Review.objects.all().\
    annotate(month=DateTime("timestamp", "month", pytz.timezone("Etc/UTC"))).\
    values("month").\
    annotate(created_count=Count('id')).\
    order_by("-month")

sqliteデータベースとMySqlデータベースの両方で、django 1.8で機能しました。

于 2015-12-24T19:25:57.520 に答える
13

日付フィールドを格納している場合は、次のように使用できます。

from django.db.models import Count

Review.objects.filter(venue__pk = 2)
    .values('date').annotate(event_count = Count('id'))

日時を格納しているため、もう少し複雑ですが、これは良い出発点となるはずです。アグリゲーションのドキュメントはこちらからご覧ください

于 2010-02-17T18:32:57.057 に答える
3

また、カスタム関数を定義することもできます:

from django.db.models.expressions import Func

# create custom sql function
class ExtractDateFunction(Func):
    function = "DATE" # thats the name of function, the way it mapped to sql

# pass this function to annotate
Review.objects.filter(venue__pk=2)
      .annotate(date_created=ExtractDateFunction("datetime_created"))
      .values('date_created')
      .annotate(created_count=Count('id'))

DBエンジンがDATE関数をサポートしていることを確認してください

于 2016-04-11T05:50:23.587 に答える