所以我有一个SensorType模型,它有一个SensorReading对象集合,作为sensorreading_set的一部分(也就是说,传感器类型有很多传感器读数)。我想注释传感器类型,给我的传感器读数与最大的id。即:
sensor_types = SensorType.objects.annotate(
newest_reading_id=Max('sensorreading__id'))这很管用,但有个陷阱。传感器读数还有另一个外键,Device。我真正想要的是对给定设备的给定传感器类型的最高传感器读取id。
发布于 2014-04-30 07:28:18
过滤对相关对象非常好,注释在这些过滤器中工作得非常好。你需要做的是:
from django.db.models import Max
SensorType.objects.filter(sensorreading__device=device) \
.annotate(newest_reading_id=Max('sensorreading__id'))注意,函数调用的顺序很重要。在使用filter之前,annotate只会对过滤集进行注释,在filter之前使用annotate对完整的集合进行注释,然后进行筛选。此外,在对相关对象进行过滤时,请记住,filter(sensorreading__x=x, sensorreading__y=y)将过滤所有条件都为真的传感器读数,而.filter(sensorreading__x=x).filter(sensorreading__y=y)将过滤这些条件中任一条件都为真的传感器读数。
发布于 2014-04-30 05:57:35
您可以在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]
)您可以在这里阅读有关.extra的更多信息:https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.extra
https://stackoverflow.com/questions/23376272
复制相似问题