gpt4 book ai didi

python - 过滤外键对象中的 > 10 个条目

转载 作者:行者123 更新时间:2023-12-05 09:34:41 25 4
gpt4 key购买 nike

organizers = Organizer.objects.filter(events__isnull=False).distinct()

for organizer in organizers:
print("-----", organizer.name, "-----")
events = organizer.events.all()
for event in events:
if not event.attendees.count() > 10:
continue

print(event.first())

您可以在这里看到我有三个查询返回第一个符合条件 > 10 名与会者的事件。我想知道是否有更好的方法将此逻辑合并到一个或两个查询集中。

最佳答案

, 你可以利用 .alias(…) [Django-doc]对于您在 SELECT … 部分中不需要的注释。

因此我们可以过滤:

Organizer.objects.alias(
<b>nattendees=Count('events__attendees')</b>
).filter(
<b>nattendees__gt=10</b>
).first()

如果 attendee 访问了该组织者的多个事件,我们在这里多次计算同一个 attendee。如果我们想计算 distinct attendees,您应该将 distinct=True 添加到 Count 表达式。

如果您使用 或更早版本,然后将 .alias(...) 替换为 .annotate(…) [Django-doc] .

由于我们没有指定顺序(假设 Organizer 模型没有 ordering 选项),它将检索 a 条件成立的组织者,而不是本身每次都是相同的组织者

对于具有满足条件的最低主键的 Organizer,我们因此排序:

#                    ↓ annotate if prior to Django-3.2
Organizer.objects.annotate(
nattendees=Count('events__attendees')
).filter(
nattendees__gt=10
)<b>.earliest('pk')</b>

关于python - 过滤外键对象中的 > 10 个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66400108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com