考虑简单的Django模型Event
和Participant
:
class Event(models.Model):
title = models.CharField(max_length=100)
class Participant(models.Model):
event = models.ForeignKey(Event, db_index=True)
is_paid = models.BooleanField(default=False, db_index=True)
使用参与者总数来注释事件查询很容易:
events = Event.objects.all().annotate(participants=models.Count('participant'))
如何用筛选的参与者计数进行注释is_paid=True
?
我需要查询所有事件,而与参与者人数无关,例如,我不需要按带注释的结果进行过滤。如果有0
参与者,那没关系,我只需要带有0注释的值即可。
文档中的示例在这里不起作用,因为它从查询中排除了对象,而不是使用注释了对象0。
更新。Django 1.8具有新的条件表达式功能,因此我们现在可以像这样:
events = Event.objects.all().annotate(paid_participants=models.Sum(
models.Case(
models.When(participant__is_paid=True, then=1),
default=0,
output_field=models.IntegerField()
)))
Django 2.0中的条件聚合使你可以进一步减少过去的流量。这也将使用Postgres的filter逻辑,该逻辑比求和的情况要快一些(我见过像20-30%这样的数字被打乱)。
无论如何,就你的情况而言,我们正在研究简单的东西:
from django.db.models import Q, Count
events = Event.objects.annotate(
paid_participants=Count('participants', filter=Q(participants__is_paid=True))
)
在文档中还有一个单独的部分,关于注释过滤。它和条件聚合是一样的东西,但是更像上面的例子。无论哪种方式,这都比我之前做的粗糙子查询要健康得多。
问题内容: 使用Django ORM,可以做类似的事情。赶上我的漂移? 这是一个用于说明可能答案的快速示例: 在Django网站中,内容创建者提交文章,普通用户查看(即阅读)所述文章。文章可以发布(即供所有人阅读),也可以草稿模式发布。描述这些要求的模型是: 我的问题是:如何才能获得所有发表的文章,并按过去30分钟内的唯一读者排序?也就是说,我想计算每个已发布文章在过去半小时内获得多少个独特(唯一
问题内容: 我有一个模型和,就像这样: 现在我有了一些和对象,我想得到一个查询,该查询选择所有指向少于2的对象。 A就像一个池子,用户(B)加入池。如果仅加入1或0,则根本不应该显示该池。 这样的模型设计可能吗?还是我应该修改一下? 问题答案: 听起来像是一份工作。 如果B计数通常是您需要的过滤或排序标准,或者需要显示在列表视图中,则可以考虑通过将b_count字段添加到A模型并在添加B或添加B时
问题内容: 在Django模型QuerySets中,我看到比较值存在和,但是存在(不等于?)。 我想使用不等于过滤掉: 例: 我想要 在不正确的语法。我试过。 我最终使用: 问题答案: 也许Q对象可以帮助解决此问题。我从未使用过它们,但似乎可以将它们取反并组合起来,就像普通的python表达式一样。 更新:我只是尝试了一下,它似乎工作得很好:
问题内容: 我正在尝试将具有对用户表的外键的表单域的查询集缩小到用户所属的组。 这些群组以前是由我关联的。该模型可能具有以下内容: 我的ModelForm非常裸露: 因此,当我实例化表单时,我在views.py中执行了以下操作: 现在我的问题是,我该如何获取myuser字段并对其进行过滤,以便仅显示“ foo”组的用户。 SQL中的查询如下所示: 我想避免使用原始SQL。有可能这样做吗? 问题答案
问题内容: 我试图过滤与日期比较。我的意思是: 我得到一个空的查询集列表作为答案,因为(我认为)我不在考虑时间,但我希望“任何时间”。 Django中有一种简单的方法吗? 我在datetime中设置了时间,但不是。 问题答案: 这种查找在中实现,具体如下 因为它很冗长,所以有计划使用运算符来改进语法。有关更多详细信息,请检查“ #9596将DateTimeField与日期比较太难 ”。
问题内容: 我有两个松散定义的模型,如下所示: 现在,在一个视图中,我想注释属于一个项目的所有InformationUnit,所以我这样做: 一切正常,而且,我想知道在每个项目中有多少个不同的“用户名”参与其中。也就是说,计算组成一个项目的InformationUnit中有多少个不同的“用户名”。我尝试了以下操作,但是无论用户名如何,它都只计算InformationUnit的数量: 请注意,用户名