group-by

wtlkbnrh  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(459)

我的django应用程序中有下一个结构:

class A(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    time = models.DateTimeField(auto_now_add=True)

我要在数据库中选择每个名称的最早时间,如:

╔═════╤══════╤════════════╗
 ║ id  │ name │    time    ║
 ╠═════╪══════╪════════════╣
 ║  1  │   a  │ 2018-09-10 ║
 ║  2  │   a  │ 2018-09-11 ║
 ║  3  │   b  │ 2018-09-10 ║
 ║  4  │   b  │ 2018-09-11 ║
 ╚═════╧══════╧════════════╝

那么结果应该是:

╔═════╤══════╤════════════╗
 ║ id  │ name │    time    ║
 ╠═════╪══════╪════════════╣
 ║  1  │  a   │ 2018-09-10 ║
 ║  3  │  b   │ 2018-09-10 ║
 ╚═════╧══════╧════════════╝

我知道rawsql是一种解决方案,但是可以使用django查询表达式吗?我用的是django1.8。请帮忙。

2sbarzqh

2sbarzqh1#

我们可以通过以下方式实现:

from django.db.models import Min

A.objects.values('name').annotate(
    min_time=Min('time')
).order_by('name')

这将导致 QuerySet 包含字典的对象:在本例中,它看起来像:

<QuerySet [{'name': 'a', 'min_time': date(2018,09,10)},
           {'name': 'b', 'min_time': date(2018,09,10)}]>

因此您可以遍历queryset,从而处理dictionary元素。

相关问题