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

标签 django django-rest-framework foreign-keys serialization

我有一个简单的足球游戏 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/

相关文章:

mysql - 如何从另一个表中获取记录的ID?

tsql - 获取具有唯一外键的表之间关系的表名

django - 我可以在 Django 中使用数据库 View 作为模型吗?

python - Django QuerySet 选择相关对象

django Restframework token 身份验证失败,错误代码为 "invalid token"

python - 删除搜索词中的重音 Django Rest Framework

mysql - 外键:简单查询不起作用

django - 如何使用 max(date) 值过滤查询

django - 在 Django 数据库中存储每周/每天的日程安排

python - 如何在 Django View 之间传递数据