簡體   English   中英

我如何告訴 django 在 Django 的 .annotate() 中使用 PostgreSQL DATE 函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM