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 回答