2013-07-24 55 views
0

鑑於以下型號訂購型號:Django的ORM:使用額外的最大(日期時間字段,最大相關項目(時間字段))

class BaseModel(models.Model): 
    modified_date = models.DateTimeField(auto_now=True) 
    class Meta: 
     abstract = True 

class Map(BaseModel): 
    ... 

class MapItem(BaseModel): 
    map = models.ForeignKey(Map) 
    ... 

如何構建我的ORM呼籲作爲排序依據的Maps最後一次是Map還是其MapItems之一被修改?

換句話說,我怎麼生成表示最大的Map's自己modified_date和其相關MapItems和排序它的最新modified_date而不是訴諸原始SQL或Python每個Map的值?

我嘗試下面的查詢,但是當我查詢集被評爲last_updated值是空白,我不明白爲什麼:

Map.objects.extra(select={ 
    "last_updated": "select greatest(max(maps_mapitem.modified_date), maps_map.modified_date) 
    from maps_map join maps_mapitem on maps_map.id = maps_mapitem.id"}). 

在此先感謝。

編輯0:作爲Peter DeGlopper points out,我的連接是不正確的。我已經固定的連接,現在last_updated值都相等而不是空白:

Map.objects.extra(select={ 
    "last_updated": "select greatest(max(maps_mapitem.modified_date), maps_map.modified_date) 
    from maps_map join maps_mapitem on maps_map.id = maps_mapitem.maps_id"}). 

回答

1

你的加入是錯誤的。它應該是:

maps_map join maps_mapitem on maps_map.id = maps_mapitem.map_id 

因爲它強調PK是平等的,而不是地圖的PK來匹配項目的FK。

編輯

我懷疑你的子查詢不加入對查詢的主要maps_map部分。我相信有其他方法可以做到這一點,但這應該可以工作:

Map.objects.extra(select={ 
    "last_updated": "greatest(modified_date, (select max(maps_mapitem.modified_date) from maps_mapitem where maps_mapitem.map_id = maps_map.id))"}) 
+0

謝謝。 「last_updated」值現在正在出現,但它們都是相同的值。我已經確認了數據庫中的不同值。任何想法爲什麼這可能是? –

+0

非常感謝。在''extra''調用之前加入''select_related''改變了結果的順序,但所有的值都保持不變。期待您的建議。同時,我會更新這個問題以反映你的第一個建議。 –

+0

是的,'select_related'實際上並不相關,因此我的刪除。它遵循錯誤方向的關係。 –

相關問題