尝试将only
与select_related
一起使用时,我收到此错误。
FieldError: Invalid field name(s) given in select_related: 'userinfo'. Choices are: userinfo
它有点奇怪,它报告了我试图选择为错误的字段。这是我的疑问:
users_with_schools = User.objects.select_related('userinfo').only(
"id",
"date_joined",
"userinfo__last_coordinates_id",
"userinfo__school_id"
).filter(
userinfo__school_id__isnull=False,
date_joined__gte=start_date
)
我已经能够在我的代码的其他地方使用select_related
和only
,所以我不确定为什么会发生这种情况。
编辑:这是完整的追溯
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "env/lib/python2.7/site-packages/django/db/models/query.py", line 138, in __repr__
data = list(self[:REPR_OUTPUT_SIZE + 1])
File "env/lib/python2.7/site-packages/django/db/models/query.py", line 162, in __iter__
self._fetch_all()
File "env/lib/python2.7/site-packages/django/db/models/query.py", line 965, in _fetch_all
self._result_cache = list(self.iterator())
File "env/lib/python2.7/site-packages/django/db/models/query.py", line 238, in iterator
results = compiler.execute_sql()
File "env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql
sql, params = self.as_sql()
File "env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 367, in as_sql
extra_select, order_by, group_by = self.pre_sql_setup()
File "env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 48, in pre_sql_setup
self.setup_query()
File "env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 39, in setup_query
self.select, self.klass_info, self.annotation_col_map = self.get_select()
File "env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 203, in get_select
related_klass_infos = self.get_related_selections(select)
File "env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 743, in get_related_selections
', '.join(_get_field_choices()) or '(none)',
FieldError: Invalid field name(s) given in select_related: 'userinfo'. Choices are: userinfo
答案 0 :(得分:5)
defer()
文档说明中的所有注意事项也适用于only()
。只有在用完其他选项后才能小心使用。...
使用
only()
并省略使用select_related()
请求的字段也是错误。
select_related
会尝试获取所有 userinfo
列。如上所述,尝试将列集限制为特定列会导致错误 - select_related
和only
的组合不支持。
值得注意的是这些方法的评论:
defer()
方法(及其表兄,only()
,以下)仅适用于高级用例。它们提供了一种优化,可以帮助您仔细分析查询并准确了解所需的信息,并测量返回所需字段与模型的完整字段集之间的差异。
修改:您在下面的评论中提到,您的代码中其他地方使用的以下查询似乎运行良好:
ChatUser.objects.select_related("user__userinfo").\
only( "id", "chat_id", "user__id", "user__username", "user__userinfo__id" )
我最好的猜测是你在Django(this bug)中点击了fixed in 1.10。
我认为最简单的验证方法是检查看起来有效的查询集生成的SQL查询。我的猜测是,您会发现它实际上并不是一次性查询所有内容,并且当您尝试访问要求在select_related
中提取的相关模型时还有其他查询。