我正在为我的 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 = ()
关于django - 相关模型 ID 在 valid_data 中丢失,即使它存在于请求中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53661333/