鉴于以下模型:
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's
个modified_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}}
答案 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))"})