我有什麼如何一次查詢多個表?
我有一個應用程序,在國際象棋比賽檔案錦標賽。該應用程序包括以下型號:
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
(名單在比賽中發揮的所有比賽)和player_view
(列出所有匹配在所有賽事中玩家扮演)
要解決的問題
鑑於我提到的意見,我需要爲每個查詢執行兩個不同的查詢。 在tournament_view
我會有篩選器(選擇篩選器)playerA
和playerB
,我需要爲它們動態地填充選項。
playersA_all = MasterTournament.objects.value_list('playerA')
playersB_all = MasterTournament.objects.value_list('playerB')
不過,我掙扎着拿出查詢player_view
:這可以很容易地完成。此視圖與選擇過濾器playerA
和playerB
非常相似,但現在,我需要查詢所有錦標賽表以獲取正在查看的玩家的所有對手。這將導致每次都有一堆數據庫命中,在這個過程中,我需要引入一個臨時列表來保存和附加不同表中的結果。
這就是爲什麼我覺得我需要重新組織我的模型,但我唯一想到的解決方案是將所有錦標賽的比賽打包在一起,這是我想防止發生的事情。
我的問題是,你有任何想法如何調整我的模型,或者Django確實提供了一個解決方案來執行我需要的查詢player_view
?
+1,我還沒有接受,因爲我沒有提到它,但playerA意味着一種'player_at_home'和'playerB'是'visitor'。我不認爲這很重要,但我實際上想區分球員,我可能需要這樣做。這些消息你認爲你的解決方案會佔上風嗎? – nutship
是的,但是您必須使用'through'來使用中間表。閱讀關於它[這裏](https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany) – yuvi
看到編輯以及 – yuvi