关键词:
【中文标题】子查询 django 查询以从对象中获取最大的不同值并返回这些对象【英文标题】:Subquery django query to get biggest disctint values from objects and return those objects 【发布时间】:2020-02-05 10:08:49 【问题描述】:所以我有这个查询,我需要重新过滤以从不同的仪表 id 中获取最大的 take_at 字段的值,但我无法让 django orm's/sql 部分进行此查询。
<QuerySet [<Reading: [127] meter installation: 29, type: 1, taken: 2019-10-07 16:06:48.101453+00:00 value: 78.0000, comment: , VAT: 22.00>, <Reading: [126] meter installation: 41, type: 2, taken: 2019-10-07 14:05:32.415905+00:00 value: 7.0000, comment: asdfe, VAT: None>, <Reading: [125] meter installation: 41, type: 2, taken: 2019-10-07 14:02:37.588983+00:00 value: 7.0000, comment: asdfe, VAT: None>, <Reading: [124] meter installation: 49, type: 2, taken: 2019-10-07 12:19:49.067398+00:00 value: 8.0000, comment: , VAT: 2.00>
这个查询包含很多 Reading 对象,但我只需要从不同的仪表安装中获取最大的 take_at 值,我尝试制作注释然后 distinct ,但它们没有一起实现,我对 SQL 有点陌生所以任何帮助都会很棒!
阅读.py
class Reading(DateTrackedModel):
meter_installation = models.ForeignKey(
"MeterInstallation",
on_delete=models.PROTECT,
related_name="readings",
null=False,
blank=False,
verbose_name=_("Meter Installation"),
)
value = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0, verbose_name=_("Value")
)
price = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0, verbose_name=_("Price")
)
reading_type = models.ForeignKey(
"MeterType",
on_delete=models.PROTECT,
null=False,
blank=False,
related_name="readings",
verbose_name=_("Reading type"),
)
comment = models.TextField(null=False, blank=True, verbose_name=_("Comment"))
taken_at = models.DateTimeField(null=False, default=now, blank=False, verbose_name=_("Taken at"))
VAT = models.DecimalField(decimal_places=2, max_digits=10, null=True, blank=True, verbose_name=_("VAT"))
unit_name = models.CharField(max_length=100, null=False, blank=True, unique=False, verbose_name=_("Unit name"))
unit_price = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0.0, verbose_name=_("Unit price")
)
仪表安装型号:
class MeterInstallation(ActiveAfterUntilModel, DateTrackedModel, MPTTModel, NamedModel): # type: ignore
meter_type = models.ForeignKey(
MeterType,
on_delete=models.PROTECT,
null=False,
blank=False,
related_name="installations",
verbose_name=_("Meter Installation type"),
)
parent = TreeForeignKey(
"self", on_delete=models.CASCADE, null=True, blank=True, related_name="children", db_index=True
)
meter = models.ForeignKey(
Meter, on_delete=models.PROTECT, related_name="installations", null=False, blank=False, verbose_name=_("Meter")
)
building = models.ForeignKey(
Building,
on_delete=models.PROTECT,
related_name="meter_installations",
null=True,
blank=False,
verbose_name=_("Building"),
)
places = models.ManyToManyField(Place, related_name="meter_installations", blank=False, verbose_name=_("Places"))
initial_reading = models.DecimalField(
decimal_places=4, max_digits=10, null=False, blank=False, default=0, verbose_name=_("Initial reading")
)
final_reading = models.DecimalField(
decimal_places=4, max_digits=10, null=True, blank=True, verbose_name=_("Final reading")
)
【问题讨论】:
【参考方案1】:目前尚不清楚您的Reading QuerySet
的当前状态是什么,但您可以在文档中找到here 的一般执行方式。在你的情况下,它应该是这样的:
reading_qs.values('meter_installation').annotate(max_taken_at=models.Max('taken_at'))
更新:
所以在第一篇文章中并不是很清楚,但是您遇到了greatest-n-per-group 问题。 (在你的情况下 n=1)
解决此特定版本问题的一种方法是通过window query(如果您的数据库支持)。应该是这样的:
reading_qs.annotate(max_taken_at=Window(
expression=Max('taken_at'),
partition_by=F('meter_installation')
)).filter(max_taken_at=F('taken_at'))
更新:这实际上是行不通的,因为Window
注释不可过滤。我认为为了过滤窗口注释,您需要将其包装在Subquery
中,但是使用Subquery
,您实际上没有义务使用Window
函数,还有另一种方法可以做到这一点,这是我的下一个例子。
另一种方法是通过subquery 它看起来像:
reading_qs.annotate(
max_taken_at=Subquery(
reading_qs.filter(meter_installation=OuterRef('meter_installation'))
.values('meter_installation')
.annotate(max_taken_at=Max('taken_at'))
.values('max_taken_at')
)
).filter(max_taken_at=F('taken_at'))
第三种解决方案,即 PostgreSQL 唯一的解决方案是:
reading_qs.order_by(
'meter_installation', '-taken_at'
).distinct('meter_installation')
【讨论】:
对不起,我可能没有在标题中说清楚,我需要对象本身而不仅仅是值。这将返回所需的值,但它只返回来自查询集的对象的values
,然后应用程序中的所有内容都会中断,因为我需要读取对象本身而不仅仅是来自查询集的值
所以您希望Reading
对象的taken_at
值等于同一meter_installation
组中所有Reading
对象中最大的taken_at
值,对吗? (问题不是很清楚)
是的,我只想从一个meter_installation 组中获取一个具有最大taken_at
值的Reading 对象,正如您所说的那样
非常感谢您对这些查询的帮助,我还需要深入研究您编写的这些查询并更好地了解这里发生了什么
是的,这是一个很大的话题,也许在普通 SQL 中对这个问题的一个很好的介绍是this one,看看它。您说您是 SQL 新手,您应该首先真正了解 SQL,以便了解 ORM 是如何/做什么/为什么做的。Django:如何从与用户相关的子查询集中获取不同的父列表?
】Django:如何从与用户相关的子查询集中获取不同的父列表?【英文标题】:Django:HowtogetadistinctParentListfromaChildQuerysetrelatedtotheUser?【发布时间】:2018-12-0113:46:56【问题描述】:这些是我的应用程序有menu_items的模型:classApp(models.M... 查看详情
如何编写 Django 查询以获取链接到另一个对象的不同对象?
】如何编写Django查询以获取链接到另一个对象的不同对象?【英文标题】:HowdoIwriteaDjangoquerytogetdistinctobjectslinkedtoanotherobject?【发布时间】:2022-01-0912:13:55【问题描述】:我正在使用Python3.9和Django3.2。我有这个类,它有另一个字... 查看详情
Spring Mongo 聚合查询以从 MongoDB 获取不同的国家名称和国家代码
】SpringMongo聚合查询以从MongoDB获取不同的国家名称和国家代码【英文标题】:SpringMongoAggregatequerytofetchdistinctcountrynameandcountrycodefromMongoDB【发布时间】:2021-12-1014:48:39【问题描述】:我有一个名为Location的集合,它有几个属性,我... 查看详情
子查询中的 Django 回合
】子查询中的Django回合【英文标题】:Djangoroundinsubquery【发布时间】:2021-01-1623:29:27【问题描述】:您好,我正在使用以下代码获取带有子查询的ListView中每个项目的进度百分比classprojects(LoginRequiredMixin,ListView):model=Projecttemplate_na... 查看详情
Django Q过滤器,无法在单个查询中获得结果
】DjangoQ过滤器,无法在单个查询中获得结果【英文标题】:DjangoQfilter,cantgetresultsinasinglequery【发布时间】:2021-06-1007:44:16【问题描述】:我想使用多个条件进行查询以从我的Order模型中获取一些对象,但我找不到在单个查询中获... 查看详情
Django - 每个不同状态的查询计数
】Django-每个不同状态的查询计数【英文标题】:Django-Querycountofeachdistinctstatus【发布时间】:2021-04-0914:06:20【问题描述】:我有一个模型Model,它有Model.status字段。status字段的值可以是draft、active或cancelled。是否可以根据状态获取... 查看详情
运行查询以从大查询中获取事件计数
】运行查询以从大查询中获取事件计数【英文标题】:RunquerytogetEventcountfrombigquery【发布时间】:2017-06-1304:34:10【问题描述】:我在问如何运行查询以从我的android应用程序获取事件计数。我的应用程序使用Firebase实时数据库,我... 查看详情
在 django 的查询集中获取对象的计数
】在django的查询集中获取对象的计数【英文标题】:Gettingacountofobjectsinaquerysetindjango【发布时间】:2011-07-2307:58:23【问题描述】:如何为数据库中的对象计数添加字段。我有以下型号:classItem(models.Model):name=models.CharField()classContes... 查看详情
Django 查询 - 在带注释的计数过滤器中获取父对象
】Django查询-在带注释的计数过滤器中获取父对象【英文标题】:Djangoquery-getparentobjectinannotatedcountfilter【发布时间】:2019-12-0706:01:36【问题描述】:我有3个模型:classUser(AbstractBaseUser,PermissionsMixin):username=models.CharField(db_index=True,ma... 查看详情
Django - 按最大(日期)年份过滤查询集
】Django-按最大(日期)年份过滤查询集【英文标题】:Django-FilteraquerysetbyMax(date)year【发布时间】:2014-03-1012:25:19【问题描述】:我想知道我是否可以在单个查询中获得某个模型的所有对象,其日期年份等于模型的Max(\'date\')年份... 查看详情
使用不同 WHERE 子句获取聚合的子查询
】使用不同WHERE子句获取聚合的子查询【英文标题】:SubquerytogetaggregatewithdifferentWHEREclause【发布时间】:2014-11-2811:18:56【问题描述】:我正在做这个查询,我从Adwords报告中获取一些我保留的数据:SELECT"client_name","customer_id",sum(cli... 查看详情
如何设置子查询以获取具有最新日期和最大 ID 的单个记录?
】如何设置子查询以获取具有最新日期和最大ID的单个记录?【英文标题】:HowcanIsetsubquerytogetsinglerecordswithlatestdateandmaximumid?【发布时间】:2020-11-1512:52:52【问题描述】:我需要设置一个查询,作为结果获取一个表,其中包含来... 查看详情
如何运行 sql 查询以从不同的 joomla 组件返回数据
】如何运行sql查询以从不同的joomla组件返回数据【英文标题】:Howtorunsqlquerytoreturndatafromdifferentjoomlacomponents【发布时间】:2012-04-2913:54:39【问题描述】:我正在尝试自定义Joomla组件的源文件。在引入JoomlaMVC模型之前,我能够在一... 查看详情
Django - 从子查询中注释多个字段
】Django-从子查询中注释多个字段【英文标题】:Django-AnnotatemultiplefieldsfromaSubquery【发布时间】:2020-07-0915:06:07【问题描述】:我正在开发一个Django项目,在该项目上我有一个“A”对象(A.objects.all())的查询集,并且我需要从“B”... 查看详情
24.django中常用的查询数据的方法以及查询对象的条件(代码片段)
Django中对数据的查询:(1)常用的查询方法:获取所有记录:s=User.objects.all()获取第一条数据:s=User.objects.first()获取最后一条数据:s=User.objects.last()关于二、三两个方法注意点: 对于Q... 查看详情
24.django中常用的查询数据的方法以及查询对象的条件(代码片段)
Django中对数据的查询:(1)常用的查询方法:获取所有记录:s=User.objects.all()获取第一条数据:s=User.objects.first()获取最后一条数据:s=User.objects.last()关于二、三两个方法注意点: 对于Q... 查看详情
如何在 django 中获取 .save() 的查询?
】如何在django中获取.save()的查询?【英文标题】:Howcanigetqueryfor.save()indjango?【发布时间】:2011-12-3004:27:13【问题描述】:我正在更新一个django模型对象。在我调用obj.save()时为每个属性设置值后,它给了我OperationalError:(2006,\'MySQL... 查看详情
如何在 Zend 中使用表上的子查询执行查询并获取 Rowset 对象作为结果?
】如何在Zend中使用表上的子查询执行查询并获取Rowset对象作为结果?【英文标题】:HowtoexecutequerywithsubqueriesonatableandgetaRowsetobjectasaresultinZend?【发布时间】:2010-11-2300:14:52【问题描述】:我目前正在努力解决如何在Zend中对Table对... 查看详情