【问题标题】:Django filter by aggregate preserving detailsDjango通过聚合保留详细信息进行过滤
【发布时间】:2019-05-05 20:14:10
【问题描述】:

我有一个相当简单的任务来使用聚合值过滤模型,例如:

class A(models.Model):
    title = models.CharField()
    address = models.CharField()
    page_count = models.IntegerField()

现在我需要选择所有 A 的总和等于相同地址的 page_count 的标题,例如 2。如果我不需要标题,那就很容易了:

A.objects.all().values('address').annotate(pages=Sum(page_count)).filter(pages=2)

但是,如果我需要为每个“行”选择所有“包含”在该行中的 As,该怎么办。

例如,我们有三个模型:

  1. A(title='X', 'address'='aa', page_count=1)
  2. A(title='Z', 'address'='aa', page_count=1)
  3. A(title='Y', 'address'='bb', page_count=1)

我只想显示那些页数摘要等于 2(即“X”和“Z”)的标题,这些标题使用地址分组。

这可以在一个查询中实现吗? prefetch_related 可能吗?

【问题讨论】:

  • what if I need for every "row" to select all As which are "included" in this row. 是什么意思?
  • 我加了一个例子

标签: python django orm django-orm


【解决方案1】:

你可以这样试试:

A.objects.all().values('address').annotate(pages=Sum(page_count)).filter(pages=2).values('title')

【讨论】:

  • 这将返回空查询集,因为地址和标题对于每一行都是唯一的(每行的页数总和为 1)。我想从列表中列出前两个标题(因为地址“aa”的 page_count 总和为 2)
  • 它对我有用,我正在使用 postgresql 和 django 2.1。
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 2010-12-06
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多