По сути, он отказывается дать мне объект 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
, скорее всего, это не так). Затем вы можете передать две команды, например, в шаблон.