переопределить функцию обновления в сериализаторе

#python #django

#python #django

Вопрос:

Я пытаюсь переопределить метод обновления в моем сериализаторе, чтобы обновить поле «статус», которое является столбцом в моей базе данных.

Я нашел здесь, в StackOverflow, этот код, который предположительно выполнит эту работу за меня:

 def update(self, instance, validated_data):
    fields=instance._meta.fields
    exclude=[]
    for field in fields:
        field=field.name.split('.')[-1] #to get coulmn name
        if field in exclude:
            continue
        exec("instance.%s = validated_data.get(field, instance.%s)"%(field,field))
    instance.save()
    return instance   
  

Но я просто не понимаю, что делает эта строка кода?

 exec("instance.%s = validated_data.get(field, instance.%s)"%(field,field))
  

Я был бы признателен за некоторую помощь, пожалуйста.

РЕДАКТИРОВАТЬ: это соответствующая часть моего сериализатора: (метод обновления не определен, но я определяю его, на мой взгляд)

 class Meta:
    model = Match
    fields = ['id', 'home_team', 'away_team', 'date_time', 'home_team_kit', 'away_team_kit',
              'home_team_score', 'away_team_score', 'competition_edition', 'competition_round',
              'stadium', 'pitch_length', 'pitch_width', 'referees', 'players', 'ball',
              'event_provider', 'lineup_provider', 'sr_id', 'status']

class MatchUpdateSerializer(MatchWriteSerializer):

    def get_unique_together_validators(self):
        return []
  

Комментарии:

1. Можете ли вы поделиться своим сериализатором, и если это modelserializer, ваша модель тоже?

2. хорошо, @Higor я собираюсь обновить свой пост

Ответ №1:

Согласно документации

Эта функция поддерживает динамическое выполнение кода Python, объект должен быть либо строкой, либо объектом кода. Если это строка, строка анализируется как набор инструкций Python, который затем выполняется (если не возникает синтаксическая ошибка).

Это означает, что мы можем передать (допустимый) код python в функцию exec в виде строки, и она выполнит его как обычный python.

В вашем случае эта функция получает данные на основе имени поля из проверенных данных и присваивает их экземпляру.

Например, если есть поле x и мы подставляем его в строку, результирующий код будет

 instance.x = validated_data.get(field, instance.x)
  

И этот код будет выполнен путем exec присвоения экземпляру значения x из проверенных данных.

Комментарии:

1. Спасибо @Nafees, что было полезно