#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, что было полезно