gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:31:32 29 4
gpt4 key购买 nike

假设我们有 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子句放在annotate之前。

来自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'))

关于sql - Django ORM - 获取组的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17887075/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com