首页 文章

如何在Django REST序列化程序update()方法上完成完整记录更新

提问于
浏览
1

我有一个名为RecipeSerializer()的基于模型的序列化器 . 在其中我有一个看起来像这样的创建方法:

class RecipeSerializer(serializers.ModelSerializer):
    hops = HopAdditionSerializer(many=True)
    fermentables = FermentableAdditionSerializer(many=True)
    style = StyleSerializer()
    yeast = YeastSerializer()
    class Meta:
        model = Recipe
        exclude = ()
    def create(self, validated_data):
        recipe = Recipe.objects.create(**validated_data)
        recipe.save();
        return recipe

我正在尝试做的是与我的update()方法类似的东西 . 在文档中,它们逐个显示每个字段并设置值:

def update(self, instance, validated_data):
    instance.email = validated_data.get('email', instance.email)
    instance.content = validated_data.get('content', instance.content)
    instance.save()

我的模型有很多领域 . 我想要做的是将验证的数据传递给类似于create方法的更新方法:

instance.update(**validated_data)

但是,我收到一个错误:

'Recipe' object has no attribute 'update'

是否可以使用经过验证的数据集更新实例的所有属性,而无需单独设置每个属性?

2 回答

  • 1

    @ ruddra的答案应该可以解决你的问题但如果你真的还想使用更新方法,你可以这样使用queryset的更新方法:

    Recipe.objects.filter(pk=instance.pk).update(**validated_data)
    

    请注意,这甚至不会使用Recipe模型的save方法,因为它使用批量更新技术

  • 0

    好吧,你可以尝试这样:

    def update(self, instance, validated_data):
        for key, value in validate_data.items():
             setattr(instance, key, value)
        instance.save()
    

    FYI: 模型实例(或对象)没有任何名为 update 的方法 . 但是查询集有update方法 .

相关问题