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

时间:2016-05-16 19:12:52

标签: python django django-queryset

尝试将onlyselect_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_relatedonly,所以我不确定为什么会发生这种情况。

编辑:这是完整的追溯

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

1 个答案:

答案 0 :(得分:5)

来自documentation

  

defer()文档说明中的所有注意事项也适用于only()。只有在用完其他选项后才能小心使用。

     

...

     

使用only()并省略使用select_related()请求的字段也是错误。

select_related会尝试获取所有 userinfo列。如上所述,尝试将列集限制为特定列会导致错误 - select_relatedonly的组合不支持。

值得注意的是这些方法的评论:

  

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中提取的相关模型时还有其他查询。