Django ORM:使用extra来按max(datetime字段,max(相关项的datetime字段))订购模型

时间:2013-07-24 21:40:17

标签: mysql django

鉴于以下模型:

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生成一个值,该值代表Map'smodified_date的最大值modified_date及其相关MapItems last_updated 1}}并按它排序而不依赖原始SQL或Python?

我尝试了以下查询,但是当我的QuerySet被评估时,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"}). 值为空,我不确定原因:

last_updated

提前致谢。

编辑0:Peter DeGlopper points out,我的加入不正确。我已经修复了连接,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}}

1 个答案:

答案 0 :(得分: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))"})