FieldError:select_related:'userinfo'中给出的无效字段名称.选择是:userinfo

Eri*_*ner 3 python django django-queryset

尝试使用,当我得到这个错误only使用select_related.

FieldError: Invalid field name(s) given in select_related: 'userinfo'. Choices are: userinfo
Run Code Online (Sandbox Code Playgroud)

它报告我试图选择的字段是一个错误,这有点奇怪.这是我的查询:

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
)
Run Code Online (Sandbox Code Playgroud)

我已经能够在我的代码中的其他地方使用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
Run Code Online (Sandbox Code Playgroud)

sol*_*oke 7

文档:

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" )
Run Code Online (Sandbox Code Playgroud)

我最好的猜测是你在Django 中遇到这个bug(在1.10中修复).

我想最简单的验证方法是检查查询集生成的SQL查询是否有效.我的猜测是,您会发现它实际上并不是一次性查询所有内容,并且当您尝试访问要求获取的相关模型时还有其他查询select_related.