2 回答
TA贡献1744条经验 获得超4个赞
从 Django 1.11 开始,您可以使用子查询功能来注释数据:
from django.db.models import OuterRef, Subquery
latest = DeviceMessage.objects.filter(device_id=OuterRef('pk')).order_by('-date_entered')
devices = Device.objects.annotate(latest_message_id=Subquery(latest.values('pk')[:1]))
message_ids = [d.latest_message_id for d in devices]
for message in DeviceMessage.objects.filter(pk__in=message_ids).select_related('device'):
print(device.name, message)
TA贡献1921条经验 获得超9个赞
“对于每个传感器,选择它的最新消息”
我假设“传感器”是指Device模型。在那种情况下(因为您现在已经澄清它BaseModel是一个抽象基类),它就像这样简单(sensor作为Device您要查询的特定实例):
sensor.devicemessage_set.order_by("-date_entered")[0]
如果您想一次为多个传感器查找此信息,最好使用annotation,例如:
from django.db.models import Max
...
Device.objects.all().annotate(latest_msg=Max("devicemssage_set__date_entered"))
这为每个Device对象提供了一个(临时)属性,称为latest_msg它保存您想要的信息。
添加回答
举报