내가 가지고있는 것한 번에 여러 테이블을 쿼리하는 방법은 무엇입니까?
나는 체스 게임에서 토너먼트를 기록한 앱을 가지고있다.
(모든 플레이어가 모든 대회를 통해 재생과 일치 목록)tournament_view
(목록 대회에서 연주 모두 일치) 및
player_view
: 나는 두 개의 서로 다른 견해를 가질 계획 이제
class Tournament(models.Model):
name = models.CharField(max_length=128)
class Player(models.Model):
name = models.CharField(max_length=128)
# Abstract base class
class Match(models.Model):
tournament = models.ForeignKey(Tournament)
playerA = models.ForeignKey(Player, related_name='%(class)s_A') # eg. mastertournament_A
playerB = models.ForeignKey(Player, related_name='%(class)s_B')
score = models.CharField(max_length=16)
class Meta:
abstract = True
# here are tables of ``Match`` instances played out in a particular
# tournaments. All ``Match`` instances share the same fields
# so, I could also have one big table for all matches but I want to keep
# each Tournament in separate table for easiness.
class MasterTournament(Match):
pass
class AmateurTournament(Match):
pass
: 응용 프로그램은 다음과 같은 모델을 포함
해결할 문제
내가 언급 한 견해를 감안할 때 각각에 대해 두 가지 다른 쿼리를 수행해야합니다. tournament_view
에는 필터 (선택 필터) playerA
과 playerB
이 있으며 동적으로 선택 항목을 채워야합니다.
playersA_all = MasterTournament.objects.value_list('playerA')
playersB_all = MasterTournament.objects.value_list('playerB')
는 그러나, 나는 player_view
에 대한 쿼리 마련하기 위해 고군분투이 쉽게 수행 할 수 있습니다. 이보기는 선택 필터 playerA
및 playerB
과 매우 유사하지만 선택 사항으로 볼 때 모든 토너먼트 테이블을 조회해야 볼 수있는 플레이어의 모든 상대방을 얻을 수 있습니다. 이렇게하면 매번 데이터베이스 히트가 발생할 것이고 다른 테이블의 결과를 저장하고 추가하기 위해 임시 목록을 도입해야 할 것입니다.
그래서 내 모델을 재구성해야 할 필요가 있다고 생각하지만 내 마음에 오는 유일한 해결책은 모든 토너먼트의 경기가 함께 포장 된 거대한 테이블 하나를 만드는 것입니다.
제 질문은 내 모델을 조정하는 방법에 대한 아이디어가 있습니까? 아니면 장고가 player_view
에 필요한 쿼리를 수행하는 솔루션을 제공합니까? 대신 두 개의 외래 키 필드를 갖는
+1 나는 아직 언급하지 않았으므로 playerA는 일종의'player_at_home'을 의미하고'playerB'는'visitor'입니다. 나는 그것이 중요하다고 생각하지 않았지만 실제로 선수 들간의 구별을 원합니다. 당신은 당신의 솔루션이이 뉴스에 우선 할 것이라고 생각합니까? – nutship
예, '통과'를 사용하여 중간 테이블을 사용해야합니다. 그것에 대해 읽어보십시오. (https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany) – yuvi
편집을 참조하십시오. – yuvi