解释Django .update()

时间:2015-10-20 15:51:03

标签: python django

我试图破译在这种情况下如何使用.update()。这是代码:

 user = User.objects.get(username=username)
 userializer = UserSerializer(user)
 other = Other.objects.get(other=userializer.data['user_id'])
 oserializer = OtherSerializer(other)
 userdata = userializer.data
 userdata.update({'target_id': oserializer['target'].value})

这是UserSerializer:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('user_id',
                          'username',
                          'sec_question_1',
                          'sec_answer_1',
                          'sec_question_2',
                          'sec_answer_2',
                          'sec_question_3',
                          'sec_answer_3',
                          'roles')

正如您所知,target_id不在序列化程序中。

所以我想知道这个.update()方法是如何更新原始模型行的,并且我想知道它的文档在哪里 - 这是QuerySet .update()吗?它是序列化器.update()(它似乎不存在 - 是否有默认值?)

我试图将其改写为更强大,并且我很难理解正在发生的事情。

2 个答案:

答案 0 :(得分:2)

它既不是那些,也不会影响行。

序列化程序的输出是标准的Python字典。 Dicts有update方法;这就是这里所说的。

该代码也可以写成:

userdata['target_id'] = oserializer['target'].value

答案 1 :(得分:0)

此处使用的.update()不是Django QuerySet.update(),而是Python词典.update().

oserializer = OtherSerializer(other) # initialize the serializer with the instance
userdata = userializer.data # get serialized representation of the object

以上2行用实例初始化序列化器。当你serializer.data传递一个实例时,它会返回一个字典,其中包含该实例的序列化表示。所以userdata是一个Python字典,或者更确切地说是OrderedDict.

现在,当您使用字典参数在.update()上调用userdata时,它会在target_id词典中添加另一个键userdata

以下几行相同。

userdata.update({'target_id': oserializer['target'].value})
userdata['target_id'] = oserializer['target'].value