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

时间:2018-12-09 17:56:14

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

我有一个基于模型的序列化程序,称为RecipeSerializer()。其中有一个create方法,如下所示:

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方法类似的update方法:

instance.update(**validated_data)

但是,我得到一个错误:

'Recipe' object has no attribute 'update'

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

2 个答案:

答案 0 :(得分:1)

好吧,你可以这样尝试:

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

仅供参考::模型实例(或对象)没有名为update的任何方法。但是有update个用于查询集的方法。

答案 1 :(得分:0)

@ruddra的答案应该可以解决您的问题,但是,如果您确实仍然希望使用更新方法,则可以通过以下方式使用queryset的更新方法:

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

请注意,由于它使用了批量更新技术,因此甚至无法使用Recipe模型的save方法