首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用筛选的相关对象集进行注释。

使用筛选的相关对象集进行注释。
EN

Stack Overflow用户
提问于 2014-04-29 22:15:09
回答 3查看 440关注 0票数 1

所以我有一个SensorType模型,它有一个SensorReading对象集合,作为sensorreading_set的一部分(也就是说,传感器类型有很多传感器读数)。我想注释传感器类型,给我的传感器读数与最大的id。即:

代码语言:javascript
复制
sensor_types = SensorType.objects.annotate(
                newest_reading_id=Max('sensorreading__id'))

这很管用,但有个陷阱。传感器读数还有另一个外键,Device。我真正想要的是对给定设备的给定传感器类型的最高传感器读取id。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-30 07:28:18

过滤对相关对象非常好,注释在这些过滤器中工作得非常好。你需要做的是:

代码语言:javascript
复制
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)将过滤这些条件中任一条件都为真的传感器读数。

票数 1
EN

Stack Overflow用户

发布于 2014-04-30 05:57:35

您可以在Django:中对这些类型的查询使用.extra

如下所示:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2014-04-30 04:59:28

正如我所理解的,您希望在两个字段上进行GROUP_BY,device_idsensortype_id。这可以使用以下方法完成:

代码语言:javascript
复制
SensorReading.objects.all().values('device_id', 'sensortype_id').annotate(max=Max('id'))

我没有试过,它是从this onethis one这两个不同的答案中提取出来的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23376272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档