【问题标题】:Django REST Framework - Serialize nested relations on createDjango REST Framework - 在创建时序列化嵌套关系
【发布时间】:2017-03-12 17:08:44
【问题描述】:

我有这两个基于以下模型的序列化器:

class LanguageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Language
        fields = '__all__'


class GameSerializer(serializers.ModelSerializer):
    language = LanguageSerializer()

    class Meta:
        model = Game
        fields = '__all__'


class Game(models.Model):
    language = models.ForeignKey(Language)


class Language(models.Model):
    name = models.CharField(max_length=50, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

当我尝试创建一个新的Game 实体时,我将这个游戏的Language id 作为参数传递。由于某些原因,DRF 期望该语言以dictionary 而不是integer 的形式传递。这是错误:

{
    "language": {
        "non_field_errors": [
            "Invalid data. Expected a dictionary, but got int."
        ]
    }
}

根据提供的Language id 创建具有Language 属性的Game 向DRF 指示的正确方法是什么?

【问题讨论】:

    标签: python django rest frameworks nested


    【解决方案1】:

    创建一个不包含有关语言的所有详细信息的单独序列化程序是一种解决方案。您可以创建一个单独的序列化程序,使用 PrimaryKeyRelatedField()

    # I always call mine shallow to differentiate between the full serializer
    class ShallowGameSerializer(serializers.ModelSerializer):
        language = serializers.PrimaryKeyRelatedField()
        class Meta:
            model = Game
            fields = '__all__'
    

    您可以在返回/列出对象时使用普通的GameSerializer,然后在创建游戏时使用ShallowGameSerializer,允许您只提供id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2017-05-24
      相关资源
      最近更新 更多