2016-05-16 2 views
3

Я получаю эту ошибку при попытке использовать only с select_related.FieldError: недопустимые имена полей, заданные в select_related: 'userinfo'. Возможные варианты: userinfo

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 в других местах в моем коде, так что я не знаю, почему это происходит.

Edit: Вот полный отслеживающий

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

Не могли бы вы включить свои модели на свой вопрос, пожалуйста? –

+0

Не могли бы вы опубликовать модели, особенно целевые FK 'userinfo'? – trinchet

ответ

5

От documentation:

All of the cautions in the note for the defer() documentation apply to only() as well. Use it cautiously and only after exhausting your other options.

...

Using only() and omitting a field requested using select_related() is an error as well.

select_related попытается принести все столбцы для userinfo. Как описано выше, попытка ограничить набор столбцов конкретными приведет к ошибке: комбинация select_related и only не поддерживает это.

Это, вероятно, стоит отметить, комментарий, который идет с этими методами:

The defer() method (and its cousin, only() , below) are only for advanced use-cases. They provide an optimization for when you have analyzed your queries closely and understand exactly what information you need and have measured that the difference between returning the fields you need and the full set of fields for the model will be significant.

Edit: Вы упоминаете в комментариях ниже, что следующий запрос, используемый в других местах в вашем коде, кажется, работает хорошо:

ChatUser.objects.select_related("user__userinfo").\ 
    only("id", "chat_id", "user__id", "user__username", "user__userinfo__id") 

Мое предположение, что вы ударяете this bug в Django (fixed in 1.10).

Я полагаю, что самый простой способ проверить - проверить SQL-запрос, сгенерированный набором запросов, который, похоже, работает. Я предполагаю, что вы обнаружите, что на самом деле он не запрашивает все за один раз и что есть дополнительные запросы, когда вы пытаетесь получить доступ к связанной модели, которую вы попросили получить в select_related.

+0

Спасибо за ваш ответ. В другом месте, у меня есть: chatusers_with_info = ChatUser.objects.select_related ("user__userinfo") только ( "ID", " chat_id", "user__id", "user__username", "user__userinfo__id" ) . И это работает нормально. Поэтому мой вопрос заключается в том, почему один работает, а другой - не так, как мне кажется. –

+0

Это может иметь какое-то отношение к тому, что первичные ключи нельзя отложить. В любом случае сообщение об ошибке в вашем заявленном случае должно быть улучшено. Не могли бы вы попробовать заменить '' user__userinfo__id'' на '' user__userinfo__school_id'' и посмотреть, есть ли у вас подобное исключение? –

+0

@ EricConner Я отредактировал свой ответ с возможным объяснением этого противоречивого поведения. – solarissmoke

Смежные вопросы