相关模型 ID 在 valid_data 中丢失,即使它存在于请求中

cor*_*ory 4 django django-serializer django-rest-framework

我正在为我的 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
Run Code Online (Sandbox Code Playgroud)

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

在我对新菜谱的 POST 请求中,我包含了样式,它是所有相关属性,包括字段ID。我已经验证此信息已通过开发控制台的请求和通过终端日志的 django 视图集中发布。

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

我可以使用 name 属性获取样式对象,但我不明白为什么相关样式对象的 ID 在 valid_data 中丢失,即使它存在于 POST 中。

cor*_*ory 6

其实我已经找到答案了...

我需要在 StyleSerializer 中包含这一行,以明确地将 ID 包含在 valid_data 中:

id = serializers.IntegerField(required=False)
Run Code Online (Sandbox Code Playgroud)

全串行器

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

相关 StackOverflow 问题