gpt4 book ai didi

python - 属性错误 : 'Query' object has no attribute 'contains_aggregate'

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:56 24 4
gpt4 key购买 nike

我正在制作一个 Django 应用程序,我有一个显示 object_set 两侧的 View (反向多对多)。因此,我想同时查询两侧的所有对象。具体来说,我希望拥有与每个 Event 关联的所有 Signup 对象。

(查看页面格式应该是这样的。)

Event (0)
-- Signup (0.0)
-- Signup (0.1)
-- Signup (0.2)
-- Signup (0.3)
Event (1)
-- Signup (1.0)
-- Signup (1.1)
Event (3)
-- Signup (3.0)
-- Signup (3.1)
-- Signup (3.2)
-- Signup (3.3)
...

代码如下:

class TournamentDetailView(DetailView):
model = Tournament

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
tournament_id = self.get_object().pk
events = Event.objects.annotate(
cached_signups=(
Signup.objects
.filter(event_id=OuterRef('pk'), tournament_id=tournament_id, dropped=False)
.order_by('created')
.defer('tournament')
)
).all()
context['events'] = events
return context

这是回溯:

Traceback:    

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in view
69. return self.dispatch(request, *args, **kwargs)

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in dispatch
89. return handler(request, *args, **kwargs)

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\detail.py" in get
106. context = self.get_context_data(object=self.object)

File "C:\Users\werdn\PycharmProjects\gwspo-signups-website\gwhs_speech_and_debate\tournament_signups\views.py" in get_context_data
171. .defer('tournament')

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)

File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py" in annotate
1000. if alias in annotations and annotation.contains_aggregate:

Exception Type: AttributeError at /tournaments/detail/lobo-howl/
Exception Value: 'Query' object has no attribute 'contains_aggregate'

我不确定为什么会发生这种情况,它似乎发生在 Signups.objects 查询中,但即使使用 Signups.objects.all(),这异常似乎被触发。这让我相信这不是使用 OuterRef('pk') 的问题。

最佳答案

你不能只把一个Query放在一个annotation里面,因为一个annotation就像是在行中添加一个列取。 Django 在注解中支持 Subquery 的概念,但这仅在您获取相关模型的一个聚合值时才有效。这会起作用,例如:

signups = Signup.objects
.filter(event_id=OuterRef('pk'), tournament_id=tournament_id, dropped=False)
.order_by('created')
.defer('tournament')
events = Event.objects.annotate(latest_signup=Subquery(signups.values('date')[:-1]))

如果你只是想优化数据库访问,这样你就不会为每个 Event 进行数据库查询来获取相关的 Signup,你应该使用 prefetch_related:

events = Event.objects.all().prefetch_related('signups')

由于您没有展示您的模型是如何定义的,我假设这是一个反向的 M2M 关系:

class Signup(models.Model):
events = models.ManyToManyField(to='Event', related_name='signups')

如果您不指定 related_name,则用于预取的属性是 signup_set(它没有在任何地方记录并且非常困惑,因为对于聚合它是小写的型号名称):

events = Event.objects.all().prefetch_related('signup_set')

这将进行两次查询:一次针对 Event 对象,一次额外针对所有相关的 Signup 对象(而不是 Event.objects.count () 查询)。 documentation for prefetch_related包含有关其工作原理的一些有用信息。

关于python - 属性错误 : 'Query' object has no attribute 'contains_aggregate' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52337608/

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