如何一次获取多个组中的最新一个

发布于 2024-10-24 19:08:01 字数 606 浏览 2 评论 0原文

我有一个这样的模型:

class Foo(models.Model):
    date = models.DateTimeField()
    language = models.TextField()
    # other stuff

我想按语言对 Foo 进行分组,然后获取每组中最新的一个。我一直无法弄清楚如何使用 django 的 QuerySet API 来执行此操作(老实说,我也不知道如何在 SQL 中执行此操作)。例如:

pk | date   |    language
---+--------+------------------
1  | 1:00   |    python
2  | 1:30   |    python/django
3  | 1:45   |    haskell
4  | 2:15   |    python
5  | 2:45   |    haskell

我想得到类似于这个结果的结果:

{ 'python': 4, 'python/django': 2, 'haskell': 5 }

其中可能不是数字,而是完整的 Foo 对象。

I have a model like this:

class Foo(models.Model):
    date = models.DateTimeField()
    language = models.TextField()
    # other stuff

And I want to group the Foos by language, then get the latest one in each group. I haven't been able to figure out how to use django's QuerySet API to do this (honestly, I don't know how to do it in SQL either). So for example:

pk | date   |    language
---+--------+------------------
1  | 1:00   |    python
2  | 1:30   |    python/django
3  | 1:45   |    haskell
4  | 2:15   |    python
5  | 2:45   |    haskell

I want to get something resembling this result:

{ 'python': 4, 'python/django': 2, 'haskell': 5 }

Where perhaps instead of numbers those are complete Foo objects.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

天生の放荡 2024-10-31 19:08:01

您可以使用原始查询来解决您的问题:

query = Foo.objects.raw('SELECT id, language, MAX(date) FROM sqltest_foo GROUP BY language;')
for foo in query:
    print foo.id, foo.language

Obs:我使用的是 SQLite 语法,但其他 SQL 语言应该类似。

You can use a raw query to solve your problems:

query = Foo.objects.raw('SELECT id, language, MAX(date) FROM sqltest_foo GROUP BY language;')
for foo in query:
    print foo.id, foo.language

Obs: I'm using SQLite syntax, but other SQL languages should be similar.

浅忆 2024-10-31 19:08:01

试试这个:

Foo.objects.values('language').annotate(max_date=Max('date')).order_by()

或者您实际上需要具有最大日期的记录的 ID 吗?

您可能想阅读以下内容: http://docs.djangoproject.com/en /dev/topics/db/aggregation/

Try this:

Foo.objects.values('language').annotate(max_date=Max('date')).order_by()

Or do you actually need the ID of records with max date?

You might want to read this: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文