gpt4 book ai didi

django - 如何将 serializers.RelatedField() 添加到 django rest 框架中的 Meta 类字段

转载 作者:行者123 更新时间:2023-12-04 14:23:48 25 4
gpt4 key购买 nike

我有一个简单的足球游戏 API。我正在使用 Django 2.0 和 Django REST 框架。我有这两个模型用于 TeamPlayer

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com