2017-05-22 34 views
0

比方說,我有排序的模型:的Django得到最新的對象匹配查詢

class Related(models.Model): 
    ... stuff .... 

class Example(models.Model): 
    field1 = models.ForeignKey(Related, on_delete=models.CASCADE, related_name='+') 
    field2 = models.ForeignKey(Related, on_delete=models.CASCADE, related_name='+') 
    created = models.DateTimeField(default=timezone.now) 
    ... more fields 

我想要做的就是選擇每個固定對FIELD1和FIELD2的最新例證。我想從示例中選擇全部的字段。假設Example中的條目數量可能是數百萬的數量級。

一個例子SQL查詢,將做的工作是一樣的東西(假設一個應用程序名稱「測試」):

select * from test_example as e 
where not exists (
    select id 
    from test_example as e2 
    where e2.field1_id = e.field1_id 
     and e2.field2_id = e.field2_id 
     and e2.created > e.created) 

是否有我表達對QuerySet的API類似的東西什麼辦法?到目前爲止,我發現的唯一解決方案是運行原始SQL,我真的想避免這種情況。

回答

0
latest = Example.objects.filter(field1="foo", field2="bar").latest('created') 

這裏更多: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

編輯:下面的答案最有可能是你追求的:

Django - remove duplicate objects where there is more than one field to compare

+0

我想要我的查詢返回所有配對的最新記錄,而不是固定配對'foo','bar' –

+0

那麼你的意思是找到兩個「重複」記錄的最新記錄? – ptr

+0

它們在某種意義上是重複的,這兩個特定字段匹配它們,但它們有許多其他字段 –

0

,我發現只爲postresql工程解決方案,但幸運的是,我正在使用postgresql。

首先讓我們從一個解釋postgresql中存在的特殊子句開始 - DISTINCT ON。你可以閱讀一個使用它的例子here。總之事實證明有效的查詢PostgreSQL裏對我的情況是:

SELECT DISTINCT ON (e.field1_id, e.field2_id) e.* 
     FROM Example as e 
     ORDER BY e.created DESC 

在上面的本質是事實,我只可以使用所選字段的子集來計算的DISTINCT。

什麼是更好的事實證明,Django的QuerySet也支持在distinct。更具體地說(引自鏈接):

在PostgreSQL只,你可以在 以指明該DISTINCT應該 適用字段的名稱傳遞位置參數(*字段)。這轉換爲SELECT DISTINCT ON SQL查詢。

使用這個我可以寫在Django如下:

Example.objects.all().order_by('field1', 'field2', '-created').distinct(
     'field1', 'field2) 

需要注意的是不同的領域應該是ORDER_BY條款中列出的第一個和他們應該以相同的順序是非常重要的。

我希望這個答案能夠幫助別人解決類似的問題。

相關問題