gpt4 book ai didi

django - 在 Django QuerySet 中组合 prefetch_related() 和 only()

转载 作者:行者123 更新时间:2023-12-05 06:46:08 25 4
gpt4 key购买 nike

我正在尝试执行以下查询:

ParentModel.objects.prefetch_related('child_model').only('parent_attribute', 'childs__child_atrtibute').all()

好像不行。 Django 抛出以下异常:

'RelatedObject' object has no attribute 'rel'

Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py", line 115, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py", line 91, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/…path_to_my_app…/models.py", line 123, in _nested_commit_on_success
return commit_on_success(*args, **kwds)
File "/Library/Python/2.7/site-packages/django/db/transaction.py", line 223, in inner
return func(*args, **kwargs)
File "/…path_to_my_app…/views.py", line 1047, in my_veiw_function
MyParentModel.objects.prefetch_related('my_child_model').only('my_parent_attribute', 'my_child_model__my_child_attribute').all():
File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 102, in __iter__
len(self)
File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 90, in __len__
self._result_cache = list(self.iterator())
File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 258, in iterator
only_load = self.query.get_loaded_field_names()
File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 1888, in get_loaded_field_names
self.deferred_to_data(collection, self.get_loaded_field_names_cb)
File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 591, in deferred_to_data
cur_model = source.rel.to
AttributeError: 'RelatedObject' object has no attribute 'rel'

如果我从 only() 方法中删除 childs__child_atrtibute 参数,一切都会按预期进行,但我的查询会返回不必要的数据。

Django 手册说我们可以将 only()defer() 与来自 select_related() 的字段结合起来。

但是有没有一种方法可以将 only() 与来自 prefetch_related() 的字段一起使用?

我试图在我的代码后面使用 ChildModel.objects.only('child_attribute').all(),但它只会生成大量查询,而不是使用来自 的缓存结果prefetch_related().

我正在使用 Django 1.5。

最佳答案

我知道我可能来晚了,而不是根据问题的要求(Django 1.5),但万一这对任何人有帮助......

从 Django 1.8 开始,使用 Prefetch对象,这可能可以实现如下:

ParentModel.objects.prefetch_related(
Prefetch(
'child_model',
queryset=ChildModel.objects.all().only(
'parent_attribute', 'childs__child_atrtibute'
)
)
)

关于django - 在 Django QuerySet 中组合 prefetch_related() 和 only(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18244340/

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