【问题标题】:django annotate count filterdjango注释计数过滤器
【发布时间】:2012-03-07 20:16:35
【问题描述】:

我正在尝试计算某些模型的每日记录,但我希望仅对具有某些 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" 的记录。那不是我需要的。

【问题讨论】:

  • 你能用过滤显示代码,显示输出,并说出你认为它有什么问题吗?
  • @GarethRees data = SomeModel.objects.extra({'created': "date(time_added)"}).values('created').annotate(placed_in_ny_count=Count('id')) len(data) 给出 153。添加 .filter(place=Place.objects.get(name='NewYork')) 返回较少,因为它仅返回创建带有“地点”的 SomeModel 记录的天数。我也想要没有这些记录的日子。我想做类似ny_counts=Count('id' where place=Place.objects.get(name='NewYork')) 并得到[{'placed_in_ny_count': 23, 'created': datetime.date(2012,1,12)}, {'placed_in_ny_count': 0, 'created': datetimedate(2012,1,13)}...]

标签: django django-queryset annotate


【解决方案1】:

您似乎想知道,对于添加了 any 对象的每一天,当天创建的对象中有多少有一个名为 New York 的地方。 (如果我误解了,请告诉我。)在需要 outer join 的 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

因此,您始终可以在 Django 中使用 raw SQL query 来表达这一点:

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 的查询语言表达;可能是这样,但是as the developers say,数据库 API 是“一种快捷方式,但不一定是万能的。”)

  2. m.id 在 SQL 查询中是多余的,但 Django requires 表示“主键......必须始终包含在原始查询中”。

  3. 您可能不想将文字 'New York' 写入查询中,因此将 pass a parameter 改为:raw('SELECT ... AND p.name = %s ...', [placename])

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 2012-04-05
    • 2019-08-17
    • 2019-06-06
    • 1970-01-01
    • 2016-08-29
    • 2011-06-04
    • 2018-06-01
    相关资源
    最近更新 更多