Python 使用过滤的相关对象集进行注释
因此我有一个Python 使用过滤的相关对象集进行注释,python,django,Python,Django,因此我有一个SensorType模型,它有一组SensorReading对象,作为SensorReading\u集的一部分(即,传感器类型有许多传感器读数)。我想对传感器类型进行注释,以获得最大id的传感器读数。也就是说: sensor_types = SensorType.objects.annotate( newest_reading_id=Max('sensorreading__id')) 这种方法效果非常好,但有一个缺点。传感器读数有另一个外键,设备。我
SensorType
模型,它有一组SensorReading
对象,作为SensorReading\u集的一部分(即,传感器类型有许多传感器读数)。我想对传感器类型进行注释,以获得最大id的传感器读数。也就是说:
sensor_types = SensorType.objects.annotate(
newest_reading_id=Max('sensorreading__id'))
这种方法效果非常好,但有一个缺点。传感器读数有另一个外键,设备
。我真正想要的是给定设备的给定传感器类型的最高传感器读数id。是否可以让注释引用基本上等于SensorReading.objects.filter(设备=设备)
的传感器读数子集 据我所知,您希望在两个字段上分组,device\u id
和sensortype\u id
。这可以通过以下方式实现:
SensorReading.objects.all().values('device_id', 'sensortype_id').annotate(max=Max('id'))
我没有试过;它取自SO和中的两个不同答案。您可以在Django中使用.extra进行这些类型的查询:
像这样:
SensorType.objects.extra(
select={
"newest_reading_id": "SELECT MAX(id) FROM sensorreading WHERE sensorreading.sensortype_id = sensortype.id AND sensorreading.device_id=%s",
},
select_params = [device.id]
)
您可以阅读更多关于。额外信息:过滤对相关对象非常有效,注释对这些过滤器非常有效。您需要做的是:
from django.db.models import Max
SensorType.objects.filter(sensorreading__device=device) \
.annotate(newest_reading_id=Max('sensorreading__id'))
请注意,函数调用的顺序很重要。在annotate
之前使用filter
将仅对过滤集进行注释,在filter
之前使用annotate
将对整个集进行注释,然后进行过滤。此外,在对相关对象进行过滤时,请记住,filter(sensorreading\uuuu x=x,sensorreading\uu y=y)
将过滤所有条件均为真的传感器读数,而.filter(sensorreading\uu x=x).filter(sensorreading\uu y=y)
将过滤其中任一条件为真的传感器读数 你就不能把那两个锁起来吗SensorReading.objects.filter(device=device)。annotation(最新的\u reading\u id=Max('SensorReading\u id'))
?您忘记了传感器类型。我需要获得每种类型的最大id传感器读数,而不是每个传感器读数的最大id,因此我不能简单地使用传感器读数资源进行链接。啊,你说得对!我把你的模特混为一谈了,不是吗?对于这种查询,您可能需要一个。