[英]How do I tell django to use the PostgreSQL DATE function in Django's .annotate()?
假設我有模型EventDateTime
,它有一個頁面的外鍵和一個日期字段。 即頁面可以有多個不同日期和時間的EventDateTime
:
模型代碼大致如下:
class EventDateTime(Orderable):
page = ParentalKey("Event", on_delete=models.CASCADE, related_name="dates")
date = models.DateTimeField(null=False, blank=False)
# Some other unrelated fields
class Event(Page):
# Some unrelated fields
該網站的工作方式是,它將在特定時間內向用戶顯示特定數量的事件(例如 10 個),而忽略同一天發生的多次事件(但不會跨越多天)。 基本上這個 SQL 查詢:
SELECT page_id, DATE(MIN(date))
FROM eventdatetime
WHERE (date >= '2020-01-05 17:45:48.545123')
GROUP BY page_id, DATE(date)
ORDER BY date
LIMIT 10;
例如可以返回:
page_id | date
---------+------------
296 | 2020-01-07
301 | 2020-01-07
298 | 2020-01-09
289 | 2020-01-10
266 | 2020-01-11
267 | 2020-01-11
268 | 2020-01-11
269 | 2020-01-11
54 | 2020-01-13
290 | 2020-01-13
但是,我無法弄清楚如何將這個確切的意圖轉換為 Django 的 ORM:
EventDateTime.objects\
.filter(page__live=True,date__gte=datetime.now())\
.values('page_id')\
.annotate(Min('date__date')).order_by('date')
這是返回的 SQL:
SELECT "web_eventdatetime"."page_id",
MIN("web_eventdatetime"."date") AS "date__date__min"
FROM "web_eventdatetime"
INNER JOIN "web_event" ON ("web_eventdatetime"."page_id" = "web_event"."page_ptr_id")
INNER JOIN "wagtailcore_page" ON ("web_event"."page_ptr_id" = "wagtailcore_page"."id")
WHERE ("web_eventdatetime"."date" >= 2020-01-05 18:07:57.516323 AND "wagtailcore_page"."live" = True)
GROUP BY "web_eventdatetime"."page_id",
"web_eventdatetime"."date" <-- does not extract date portion
ORDER BY "web_eventdatetime"."date" ASC
請注意在倒數第二行中,由於某種原因,Django 不理解我按DATE(MIN(date))
而不是MIN(date)
分組的意圖(不幸的是,在這種情況下會有所不同)。 :(
我如何告訴 Django 只按日期部分分組,而不是按整個日期時間分組?
在值表達式中使用日期查找顯式添加日期字段。 這將根據查詢集的日期字段的日期部分進行分組。
.values('page_id', 'date__date')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.