2

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 の方法を使用する必要があります。

4

1 に答える 1

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を知っています)、Django 1.5.1 ではこれがうまくいかないようです。get__display

于 2013-06-22T20:00:45.087 に答える