2015-10-20 2 views
0

Я пытаюсь расшифровать использование .update() в этом контексте. Вот код:Интерпретация 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

Это не тот, и он не влияет на ряд.

Выходной сигнал сериализатора - стандартный словарь Python. У диктов есть метод update; вот что здесь называется.

Этот код может так же хорошо было написано:

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

Это имеет смысл. Я приму это, как только смогу. –

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