微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – Django ORM – 获取组的最新记录

想象一下,我们有Django ORM模型Meetup,其定义如下:
class Meetup(models.Model):
    language = models.CharField()
    date = models.DateField(auto_Now=True)

我想为每种语言取一个最新的聚会.

看起来你可以使用Django Aggregates来简化这种查找:

Meetup.objects.annotate(latest_date=Max("date")).values("language","latest_date")

在我看来,这应该取得每种语言的“最新”聚会.但事实并非如此:

>>> Meetup.objects.create(language='python')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='python')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node')
<Meetup: Meetup object>
>>> Meetup.objects.annotate(latest_date=Max("date")).values("language","latest_date").count()
4

我期望得到两个最新的Python和Node聚会!

如何构建一个只能获取每种语言的最新聚会的查询

PS.我使用MysqL作为我的后端.

解决方法

将您的values子句放在注释之前.

aggregation docs

If the values() clause precedes the annotate(),the annotation will be computed using the grouping described by the values() clause.

However,if the annotate() clause precedes the values() clause,the annotations will be generated over the entire query set. In this case,the values() clause only constrains the fields that are generated on output.

所以这应该这样做:

Meetup.objects.values('language').annotate(latest_date=Max('date'))

原文地址:https://www.jb51.cc/mssql/83573.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐