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

标签 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 View 集中发布。

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

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

最佳答案

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

我需要在 StyleSerializer 中包含这一行,以在 valid_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

关于django - 相关模型 ID 在 valid_data 中丢失,即使它存在于请求中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53661333/

相关文章:

django - 使用 native 序列化器 Django 将数据序列化为 json 格式

python - 请参阅 django-rest-framework 下拉列表中的描述?

python - Django 和 "Ordinary"Python 类成员和实例成员的区别?

python - Django 模板 : How to determine which object/model a queryset is composed of?

Django-nonrel vs Django 与 PyMongo/Ming 用于 MongoDB

reactjs - 'http ://localhost:300 0' has been blocked by CORS policy: No ' Access-Control-Allow-Origin' header is present on the requested resource

python - 将列表转换为查询集

python - 如何将 Django 对象发送到 celery 任务?

python - celery 任务未在 Django 数据库中注册

Django Rest Framework AttributeError 'function' 对象在 router.register 中没有属性 'model'