2

一部のモデルの毎日のレコードをカウントしようとしていますが、いくつかの fk フィールド = xy を持つレコードに対してのみカウントが行われるようにしたいので、新しいレコードが作成された日のリストを取得しますが、一部は 0 を返す可能性があります。

class SomeModel(models.Model):
    place = models.ForeignKey(Place)
    note = models.TextField()
    time_added = models.DateTimeField()

name="NewYork" の場所があるとします。

data = SomeModel.objects.extra({'created': "date(time_added)"}).values('created').annotate(placed_in_ny_count=Count('id'))

これは機能しますが、すべてのレコードを表示します..すべての場所。

フィルタリングを試みましたが、 のレコードがなかった日は返されませんplace.name="NewYork"。それは私が必要とするものではありません。

4

1 に答える 1

1

オブジェクトが追加された日ごとに、その日に作成されたオブジェクトのうち、ニューヨークという名前の場所がいくつあるかを知りたいようです。(誤解していたら教えてください。)外部結合が必要なSQLでは:

SELECT m.id, date(m.time_added) AS created, count(p.id) AS count
  FROM myapp_somemodel AS m
  LEFT OUTER JOIN myapp_place AS p
       ON m.place_id = p.id
       AND p.name = 'New York'
  GROUP BY created

したがって、生の SQL クエリを使用して Django でこれをいつでも表現できます。

for o in SomeModel.objects.raw('SELECT ...'):   # query as above
    print 'On {0}, {1} objects were added in New York'.format(o.created, o.count)

ノート:

  1. これが Django のクエリ言語で表現できるかどうかはまだわかりません。そうかもしれませんが、開発者が言うように、データベース API は「ショートカットですが、必ずしも万能ではありません」)。

  2. m.idSQL クエリでは不要ですが、Django では「主キー ... は常に生のクエリに含める必要がある」必要があります。

  3. 'New York'おそらくリテラルをクエリに書きたくないので、代わりにパラメーターを渡します: raw('SELECT ... AND p.name = %s ...', [placename]).

于 2012-02-17T10:36:17.813 に答える