即使请求中存在相关的模型ID,它也会在validated_data中丢失

时间:2018-12-06 23:43:57

标签: django django-rest-framework django-serializer

我正在为Web应用程序使用create()方法,该方法将Django REST框架用于后端API。

在这种情况下,我试图创建一个新的RECIPE,它具有相关模型STYLE的外键字段...

尝试通过ID将新配方记录与现有相关对象关联时遇到问题。

我的序列化器如下:

class StyleSerializer(serializers.ModelSerializer):
    http_method_names = ['get']
    class Meta:
        model = Style
        exclude = ()

class RecipeSerializer(serializers.ModelSerializer):
    hops = HopAdditionSerializer(many=True, read_only=True)
    fermentables = FermentableAdditionSerializer(many=True, read_only=True)
    style = StyleSerializer()
    yeast = YeastSerializer(read_only=True)
    class Meta:
        model = Recipe
        exclude = ()
    def create(self, validated_data):
        style_data = validated_data.pop('style')
        style = Style.objects.get(pk=style_data.get('id'))
        reipce = Recipe.objects.create(**validated_data)
        recipe.style = style
        recipe.save();
        return recipe

您可以看到我正在尝试为新配方对象分配一个相关的Style对象。

在POST请求新配方时,我包括样式,它是所有相关属性,包括字段 ID 。我已验证此信息是否已通过开发人员控制台在请求中以及通过终端日志在Django视图集中得到了发布。

但是,在我的序列化器create()方法中,validated_data.pop('style')返回的字典对象中始终缺少ID值。每个其他字段都存在,只是缺少的ID。

我可以使用name属性获得样式对象,但是我不理解为何相关的Style对象的ID在validated_data中丢失了,即使它存在于POST中也是如此。

1 个答案:

答案 0 :(得分:0)

实际上,我找到了答案...

我需要在StyleSerializer中包含此行,以便在validated_data中明确包含ID:

id = serializers.IntegerField(required=False)

完整序列化器

class StyleSerializer(serializers.ModelSerializer):
    http_method_names = ['get']
    id = serializers.IntegerField(required=False)
    class Meta:
        model = Style
        exclude = ()

Related StackOverflow Question