我有一个简单的足球游戏 API。我正在使用 Django 2.0 和 Django REST 框架。我有这两个模型用于 Team
和 Player
class Team(models.Model):
name = models.CharField(max_length=60)
budget = models.FloatField(default=100.0) # Millions? 114.53 M
user = models.OneToOneField(User, unique=True, on_delete=models.CASCADE)
competitions = models.ManyToManyField(Season)
def __str__(self):
return self.name
class Player(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField(null=True)
inMarket = models.BooleanField(default=False)
lastInMarket = models.DateTimeField(null=True)
team = models.ForeignKey(Team, null=True, on_delete=models.DO_NOTHING, related_name='team')
据我所知,这是定义 OneToMany 关系的正确方法,即 Team
有很多 Players
。现在,另一方面,我想为一个具体的球队显示一个 APIView
来显示球队的所有信息,包括球员的信息。我有这两个 Serializers
:
class PlayersSerializer(serializers.ModelSerializer):
team = serializers.RelatedField(read_only=True)
class Meta:
model = Player
fields = ('id', 'name', 'age', 'position', 'team')
def create(self, validated_data):
pass
def update(self, instance, validated_data):
pass
class TeamSerializer(serializers.ModelSerializer):
players = serializers.RelatedField(read_only=True, many=True)
class Meta:
model = Team
fields = ('name', 'user', 'competitions')
def create(self, validated_data):
return Team.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.players = validated_data
return instance
这是迄今为止我找到的找回球队球员的最佳方式。但是,我不确定这是否是正确的方法。无论如何,我无法将 players
添加到 fields
因为 Team
模型没有 players 属性(引发异常)。我怎么能以某种方式解决这个问题?我有点迷路了
最佳答案
其实很简单。您可以使用您在模型(团队
)中定义的related_name
。最好将该字段重命名为 players
。您可以像以前一样为 Player 定义 Serializer,然后在字段中添加 related_name
。在你的情况下 team
(或 players
)。然后在团队序列化器中为玩家添加序列化器(如果将玩家定义为 related_name
,则可以添加玩家)。
在 models.py
中:
class Player(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField(null=True)
inMarket = models.BooleanField(default=False)
lastInMarket = models.DateTimeField(null=True)
team = models.ForeignKey(Team, null=True, on_delete=models.DO_NOTHING, related_name='players')
在serializers.py
中:
class PlayersSerializer(serializers.ModelSerializer):
# you don't need RelatedField to Team because players will be under the team
team = serializers.RelatedField(read_only=True)
class Meta:
model = Player
fields = ('id', 'name', 'age', 'position', 'team')
def create(self, validated_data):
pass
def update(self, instance, validated_data):
pass
class TeamSerializer(serializers.ModelSerializer):
players = PlayerSerializer(read_only=True, many=True)
class Meta:
model = Team
fields = ('name', 'user', 'competitions', 'players')
def create(self, validated_data):
return Team.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.players = validated_data
return instance
如果您在实现过程中遇到问题,请发送评论并告诉我它是否按您预期的方式工作。
关于django - 如何将 serializers.RelatedField() 添加到 django rest 框架中的 Meta 类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50078967/