我有一个基于模型的序列化程序,称为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'
是否可以使用经过验证的数据集更新实例的所有属性,而无需单独设置每个属性?
答案 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方法