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,因此我不能简单地使用传感器读数资源进行链接。啊,你说得对!我把你的模特混为一谈了,不是吗?对于这种查询,您可能需要一个。