переопределить функцию обновления в сериализаторе - PullRequest
0 голосов
/ 24 апреля 2019

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

Я нашел здесь в 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 Ответ

0 голосов
/ 24 апреля 2019

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...