gpt4 book ai didi

python - Django:.annotate 返回意外结果

转载 作者:行者123 更新时间:2023-12-01 00:49:17 25 4
gpt4 key购买 nike

目前,我有这两个查询集:

(
Event.objects.filter(organizer=1)
.values('pk', 'organizer')
.annotate(
sold_tickets=Count('attendees', filter=Q(attendees__canceled=False))
)
.order_by('organizer')
)


(
Event.objects.filter(organizer=1)
.values('pk', 'organizer')
.annotate(available_tickets=Coalesce(Sum('tickets__quantity'), 0))
.order_by('organizer')
)

结果是:

<EventQuerySet [{'pk': 6, 'organizer': 1, 'sold_tickets': 1}, {'pk': 1, 'organizer': 1, 'sold_tickets': 529}, {'pk': 5, 'organizer': 1, 'sold_tickets': 1}, {'pk': 4, 'organizer': 1, 'sold_tickets': 2}]>
<EventQuerySet [{'pk': 1, 'organizer': 1, 'available_tickets': 1721}, {'pk': 4, 'organizer': 1, 'available_tickets': 30}, {'pk': 5, 'organizer': 1, 'available_tickets': 10}, {'pk': 6, 'organizer': 1, 'available_tickets': 20}]>

现在我的想法是将这些结合起来。但是,我总是在查询中得到意想不到的错误数字:

(
Event.objects.filter(organizer=1)
.values('pk', 'organizer')
.annotate(
available_tickets=Coalesce(Sum('tickets__quantity'), 0),
sold_tickets=Count('attendees', filter=Q(attendees__canceled=False))
)

.order_by('organizer')
)

这是结果

<EventQuerySet [{'pk': 6, 'organizer': 1, 'available_tickets': 20, 'sold_tickets': 2}, {'pk': 1, 'organizer': 1, 'available_tickets': 1765746, 'sold_tickets': 2116}, {'pk': 5, 'organizer': 1, 'available_tickets': 10, 'sold_tickets': 1}, {'pk': 4, 'organizer': 1, 'available_tickets': 60, 'sold_tickets': 4}]>

关于 .annotate 有什么我不明白的地方吗?

最佳答案

我好像也遇到过同样的问题,但不知道是不是你的问题。尝试将 distinct=True 添加到您的 annotate 中,它应该是:

.annotate(
available_tickets=Coalesce(Sum('tickets__quantity'), 0)
).annotate(
sold_tickets=Count('attendees', filter=Q(attendees__canceled=False), distinct=True)
)

或者您可以尝试添加.distinct(),如下所示:

.annotate(
available_tickets=Coalesce(Sum('tickets__quantity'), 0),
sold_tickets=Count('attendees', filter=Q(attendees__canceled=False))
).distinct('available_tickets','sold_tickets')

这是我找到的解决方案:https://docs.djangoproject.com/en/dev/topics/db/aggregation/#combining-multiple-aggregations

关于python - Django:.annotate 返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56701067/

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