如何一次获取多个组中的最新一个
我有一个这样的模型:
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 Foo
s 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用原始查询来解决您的问题:
Obs:我使用的是 SQLite 语法,但其他 SQL 语言应该类似。
You can use a raw query to solve your problems:
Obs: I'm using SQLite syntax, but other SQL languages should be similar.
试试这个:
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/