【问题标题】:Group By in django 1.8在 django 1.8 中分组
【发布时间】:2018-09-11 13:43:04
【问题描述】:

我的 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。 请帮忙。

【问题讨论】:

  • 这看起来不像是 GROUP BY,因为那时 id 不会成为结果的一部分。您只想要最早的 time,还是“最早”的对象?
  • 最早的(时间,名称)元组

标签: mysql django django-models


【解决方案1】:

我们可以这样做:

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

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

【讨论】:

  • 是的,它有效,谢谢。但是如果有更多字段:(id,name,fname,time),我需要最早的(time,name,ftime)元组,那就错了。
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 2015-12-24
  • 2015-10-10
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多