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方式进行查询。
答案 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。