0

给定以下模型:

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

换句话说,如何在不使用原始 SQL 或 Python 的情况下为每个值生成一个值,该值Map代表Map's自己的最大值及其相关modified_date的最新值并按其排序?modified_dateMapItems

我尝试了以下查询,但是在last_updated评估我的 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"}).

提前致谢。

编辑 0:正如Peter DeGlopper 指出的那样,我的加入不正确。我已经修复了连接,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"}).
4

1 回答 1

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))"})
于 2013-07-24T21:46:33.873 回答