繁体   English   中英

如何使用多个字段更新 Django 实例 object

[英]how to update Django instance object with multiful fields

我想通过 function update() 更新一个实例,下面是 class CardSerializer:

class CardSerializer(serializers.ModelSerializer):

    image = serializers.CharField(read_only=True) 
    class Meta:
        model = Card
        fields = ('id', 'template', 'data', 'MD5', 'image_md5',
              'image', 'target_url', 'title', 'description',
              'created', 'updated', 'createdBy')
        read_only_fields = ['MD5', 'image_md5', 'image', 'createdBy']

    def update(self, instance, validated_data):
        # TODO Bug Fix
        new_ins = Card(**instance.data.update(validated_data))
        md5 = new_ins.gen_md5()
        lookup = Card.objects.filter(MD5=md5).first()
        if lookup:
            return lookup

        return super(CardSerializer, self).update(instance, validated_data)

目前我在一个卡实例中使用patch (id=206) http://127.0.0.1:8000/api/Card/206/正文{"title": "asd"} ,但会引发错误 {template: no this场地}。 然后我调试,发现 function update(self, instance, valid_data) can't generate a new instance (new_ins) in line

new_ins = Card(**instance.data.update(validated_data))

调试控制台中的 arg validated_data数据是

>validated_data
{'title': 'asd'}
    'title':'asd'
    __len__:1

实例是 class object 卡():

data:{'address': '123 Sydney St, Sydn... NSW 2000', 
    'avatar': 'https://cn.meetkol...._real.jpg', 
    'cover': 'https://cn.tdintell...Group.jpg', 
    'desc': 'vvvvbbbbbbxxxxxx jush oaighijjjoh', 
    'mail': 'zhujia@email.com', 
    'phone': '(61)0 410 888 888', 
    'qr': 'https://zhujia.com....ge/qr.png', 
    'title': 'new building', 
    'user': 'Martin'
}
MD5:'ae853b247d8510f06a9741e74b7851c3'
description:''
pk:206
template:<CardTemplate: 7 | property_share_long | v1 long>
template_id:7
title:''
updated:datetime.datetime(2020, 6, 30, 1, 35, 32, 871820, tzinfo=<UTC>)
'createdBy':<User: stevenqin>

queryset实例没有名为update的方法,但查询集有。 因此,您可以:

class CardSerializer(serializers.Serializer):
    ...
    def update(self, instance, validated_data):
        # set attrs at the instance level
        for key, value in validated_data.items():
            setattr(instance, key, value)
        return instance

# or
class CardSerializer(serializers.Serializer):
    ...

    def update(self, instance, validated_data):
        # note: .filter returns a queryset object which has .update method available for use 
        instance = Card.objects.filter(instance.pk).update(**validated_data)
        return instance

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM