Django Annotate不分组,除非我添加值()

时间:2013-06-12 04:24:38

标签: django python-3.x django-views

Python 3& Django 1.5.1。

我想获得一个QuerySet对象,该对象按日期对人进行分组。日期是从ForeignKey中提取的,因此如果我在查询中使用values(),它不会返回日期,而只会返回作为实际键的id#。如果我不使用values(),则查询不会分组。现在,据我所知,annotate()是对QuerySet进行分组的方法。

那么有没有办法“分组”而不使用values()

我不关心使用values(),但它迫使我使用额外的查询(因此服务器上的开销更大)只是为了得到日期。

模特 -

class Event(models.Model):
    day = models.DateField()
    blah = models.TextField()

class Worker(models.Model):
    eid = models.ForeignKey('Events')
    name = models.CharField(max_length=50)
    hours = models.TimeField()
    job_title = models.CharField(max_length=20)

我想要显示的内容,如此 -

Name | Days Worked | Hours | Last Worked
-----------------------------------------
Dan  |      4      | 30:00 | 2013-06-10
Ted  |      3      | 22:00 | 2013-06-09
Bill |      2      | 16:00 | 2013-06-11
-----------------------------------------

但我得到的最好的是显示ForeignKey -

ww = Worker.objects.filter(eid__day__year=year,eid__day__month=month
                           ).values('name','job_title').annotate(
                               whours=Sum('hours'),
                               wcount=Count('name'),
                               recent=Max('eid'),).order_by(
                               '-wcount','-recent','hours','name')

Name | Days Worked | Hours | Last Worked
-----------------------------------------
Dan  |      4      | 30:00 |      5
Ted  |      3      | 22:00 |      2
Bill |      2      | 16:00 |      8
-----------------------------------------

或者,获取日期&当我尝试获取对象时没有分组 -

ww = Worker.objects.filter(eid__day__year=year,eid__day__month=month
                           ).annotate(
                               whours=Sum('hours'),
                               wcount=Count('name'),
                               recent=Max('eid'),).order_by(
                               '-wcount','-recent','hours','name')

Name | Days Worked | Hours | Last Worked
-----------------------------------------
Ted  |      1      | 08:00 | 2013-06-07
Dan  |      1      | 08:00 | 2013-06-10
Ted  |      1      | 04:00 | 2013-06-03
Dan  |      1      | 08:00 | 2013-06-06
Bill |      1      | 08:00 | 2013-06-09
Ted  |      1      | 10:00 | 2013-06-01
Dan  |      1      | 06:00 | 2013-06-02
Dan  |      1      | 08:00 | 2013-06-04
Bill |      1      | 08:00 | 2013-06-11
-----------------------------------------

我猜测必须是一种分组方式,而不强制使用普通值和额外查询,但我不明白如何做到这一点。这在普通的MySQL中很容易做到,但我必须在PostgreSQL和MySQL中完成这项工作,所以我需要使用Django方式进行查询。

1 个答案:

答案 0 :(得分:0)

终于明白了。我只需要将__day添加到recent的值。

ww = Worker.objects.filter(eid__day__year=year,eid__day__month=month
                       ).values('name','job_title').annotate(
                           whours=Sum('hours'),
                           wcount=Count('name'),
                           recent=Max('eid__day'),).order_by(
                           '-wcount','-recent','hours','name')

对于未来的反抗,如果有人需要抓住模型choices元组的人类可读部分(你知道,get_& _display),那似乎不起作用为此在Django 1.5.1。