Я вижу там несколько решений.
1.
Если вы не ожидаете, что в будущем будет сыгран матч между другими командами, отличными от двух, лучше всего просто удалить поле ManyToMany из вашего второго дизайна:
Match(Model):
team1 = ForeignKey('Team')
team2 = ForeignKey('Team')
Это удалит избыточность в базе данных и упростит Match
модификаций (вам не нужно беспокоиться о связности между полем team
и соответствующими полями team1
, team2
). Это также делает невозможным создание соответствия с другим числом соответствующих команд, кроме двух, что приводит к согласованности базы данных.
С другой стороны, вы теряете гибкость, и написание запросов сложнее из-за двух проверяемых полей вместо одного.
2.
Возможно, вы захотите использовать кеш. На самом деле - эти два поля у вас есть не что иное, как это, но перемещение их в выделенную кеш-базу данных может сделать ее более эффективной и отделить вашу основную базу данных от кэшированных значений, что приводит к более четкому дизайну базы данных.
3.
Напишите свой собственный сборщик ManyToMany. Это не очень сложно сделать, но довольно уродливо. Вы должны выбрать команды, которые вас интересуют, и затем каким-то образом прикрепить их к объектам Match, например ::
matches # Match QuerySet
related_teams = Team.objects.filter(match__in=matches)
matches_map = {}
for t in related_teams:
matches_map[t.match_id]= matches_map.get(t.match_id, []).append(t)
for m in matches:
m.fetched_teams = matches_map[m.pk]
3,5.
Новая версия Django будет иметь метод prefetch_related()
, предназначенный для работы с запросами ManyToMany, но, полагаю, у вас не так много времени.