Django Rest Framework在非外键字段上连接2个表

时间:2017-03-18 20:23:36

标签: django join django-rest-framework

我在我的网站上使用Django,因此决定使用Django Rest Framework来构建我的REST API。但是,在加入表格时我遇到了一个常见问题。如果在直接外键上定义连接,一切正常。但是,当在非直接外键字段上定义连接时,事情会变得混乱。

例如,我将玩家的统计数据存储在一个表中。 (统计表有1个fk - >播放器) 我将参赛者存放在另一张桌子的比赛中(此表有2个fk - >球员,比赛)

如果我使用玩家元数据检索统计信息,一切正常。但是我想在特定比赛中检索所有玩家的统计数据。

在SQL中,我可以将参与者表与玩家ID上的统计表联系起来(常见的fk,但就Django而言,两个表之间没有直接链接,即两个表的各个模型都没有定义)然后过滤竞争。

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 个答案:

答案 0 :(得分: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