Django 1.8中的分组依据

时间:2018-09-11 13:43:04

标签: mysql django django-models

我的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 ║
 ╚═════╧══════╧════════════╝

我知道raw-sql是一种解决方案,但是可以使用Django查询表达式吗?我正在使用django 1.8。 请帮忙。

1 个答案:

答案 0 :(得分:2)

我们可以这样做:

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)}]>

因此您可以遍历查询集,从而处理字典元素。