Индексирование не работает при использовании postgres с Django - PullRequest
0 голосов
/ 10 марта 2020

Итак, проблема довольно проста, но я не смог найти никакой информации, связанной с ней

>>> Match.objects.all()[0].team_set.all()
<QuerySet [<Team: EG>, <Team: Liquid>]>
>>> Match.objects.all()[0].team_set.all()[1:2]
<QuerySet [<Team: Liquid>]>
>>> Match.objects.all()[0].team_set.all()[0:1]
<QuerySet [<Team: Liquid>]>
>>> Match.objects.all()[0].team_set.all()[0]
<Team: Liquid>
>>> Match.objects.all()[0].team_set.all()[1]
<Team: Liquid>

По сути, он отказывается дать мне объект ForeignKey по индексу. Есть идеи?

1 Ответ

1 голос
/ 10 марта 2020

По сути, он отказывается дать мне объект ForeignKey по индексу. Есть идеи?

Если вы не укажете заказ, база данных может вернуть записи в любом возможном порядке. Следовательно, это означает, что выполнение одного (неупорядоченного) запроса несколько раз может каждый раз давать другой результат.

Поэтому рекомендуется использовать .order_by() [Django -doc] если что-то должно иметь определенный порядок c. Например, в случае разбиения на страницы, не делая этого, можно нарушить разбиение на страницы.

Здесь вы, таким образом, можете проверить запрос с помощью:

Match.objects<b>.order_by('pk')</b>[0].team_set<b>.order_by('pk')</b>
Match.objects<b>.order_by('pk')</b>[0].team_set<b>.order_by('pk')</b>[0]
Match.objects<b>.order_by('pk')</b>[0].team_set<b>.order_by('pk')</b>[0:1]
Match.objects<b>.order_by('pk')</b>[0].team_set<b>.order_by('pk')</b>[1]
Match.objects<b>.order_by('pk')</b>[0].team_set<b>.order_by('pk')</b>[1:2]

То, что сказано, обращаясь к объектам по id, не очень эффективно: это сделает * запрос к базе данных за индекс . Поэтому лучше стремиться «пакетировать» запросы и, таким образом, сделать один запрос, который выбирает, например, две записи.

Например, вы можете получить первые две записи и выполнить повторяемую распаковку:

<b>team1, team2</b> = Match.objects.order_by('pk')[0].team_set.order_by('pk')<b>[:2]</b>

Здесь team1 - первая команда, а team2 - вторая. Это вызовет ошибку, если нет двух команд (но поскольку это Match, скорее всего, это не так). Затем вы можете передать две команды, например, в шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...