2017-03-18 50 views
0

我爲我的網站使用Django,因此決定使用Django Rest Framework來構建我的REST API。但是,當我加入表格時,我有一個共同的問題。如果連接在直接外鍵上定義,則一切正常。然而,當連接被定義在非直接外鍵字段上時,事情就會變得不合時宜。Django Rest Framework在非外鍵字段上連接2個表

例如,我在一個表中存儲玩家的統計數據。 (統計表有1個Fk - >球員) 我存儲參與者在另一個表中的比賽(此表有2個FK - >球員,比賽)

如果我檢索玩家元數據的統計信息,一切工作正常。但是我想在給定的比賽中檢索所有球員的統計數據。

在SQL中,我可以加入參與者表與玩家id(常見的fk,但兩個表之間沒有直接鏈接,就Django而言,即沒有定義在2個表的單個模型上)的參與者表和然後過濾競爭。

select a.* from Stats a inner join Participants b on a.player = b.player where competition = '%s' 

如何使用Django對象語法複製它?我想將其轉換爲:

Stats.objects.filter(stats__competition = %s) 

到目前爲止,我一直在使用原始SQL作爲解決方法。不過,我想轉向更持久的解決方案。

有什麼建議嗎?如果遷移很簡單,並且這個連接問題很容易解決,我願意轉移到另一個REST框架(遠離Django REST)。

編輯:添加簡約模型:

class Stats(models.Model): 
    player = models.ForeignKey(Player, related_name='stats_player') 
    ... (other fields) 

class Participants(models.Model): 
    player = models.ForeignKey(Player, related_name='participant_player') 
    competition = models.ForeignKey(Competition, related_name='participant_competition') 

回答

1

像這樣的東西應該工作: Stats.objects.filter(player__competitions = '%s')
(它將返回統計信息是參加一個給定的比賽的球員)

我們需要你的Django模型聲明確保字段名稱。
下面是一個簡單的模型將用此過濾器的工作:

class Stats(models.Model): 
    player = ForeignKey(Player, related_name='stats_player') 
    ... 

class Competition(models.Model): 
    name = CharField(max_length=32) 

class Player(models.Model): 
    competitions = ManyToManyField(Competition) 

然後,你可以寫Stats.objects.filter(player__competitions__name = '%s')

也可以指定你的多對多關係的參與者模型,但你不必:

class Player(models.Model): 
    competitions = ManyToManyField(Competition, through='Participant') 

class Participant(models.Model): 
    player = models.ForeignKey(Player, related_name='participant_player') 
    competition = models.ForeignKey(Competition, related_name='participant_competition') 
    ... other fields 
+0

我添加了簡約的機型。您的解決方案沒有爲球員的典範工作沒有競爭的領域...如果你使用 – Shubham

+0

播放模式不需要比賽場ManyToManyField。通過參數,您的參與者表可以被ManyToManyField使用。見https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ManyToManyField – pchiquet

+0

不錯..我認爲你的修改答案應該工作..但我目前陷入了一個週期性的進口問題..(感謝在各種文件中拆分我的模型以獲取所需的模式名稱!) – Shubham

相關問題