覆盖序列化器中的更新功能

时间:2019-04-24 13:31:59

标签: python django

我正在尝试覆盖序列化程序中的update方法,以更新字段“ 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 :(得分:0)

根据文档

  

该函数支持动态执行Python代码,对象必须是字符串或代码对象。如果是字符串,则将字符串解析为一组Python语句,然后执行该语句(除非发生语法错误)。

这意味着我们可以将(有效)python代码作为字符串传递给exec函数,它将像普通python一样执行。

在您的情况下,此功能是从已验证的数据中基于字段名称获取数据并将其分配给实例。

例如,如果存在一个字段x,而我们将其替换为字符串,则结果代码将为

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

然后通过exec将经过验证的数据中的x值分配给实例来执行此代码。