需求:需要通过动态变量名,取得对应的值。
例如,定义有如下类(也许是自己设计的表结构不合理),时不时需要获取或设置变量 env_* 变量的值然后更新数据库,所以急需使用变量名的变量,要不就需要写一堆判断语句:
# 发布单 model
class Order(models.Model):
current_env = models.IntegerField(default=0) # 0:刚新建,1-5:对应测试环境/生产环境等等
env_1 = models.IntegerField(default=0) # 环境间流转状态,0:没开始,1:待发布,2:已发布
env_2 = models.IntegerField(default=0)
env_3 = models.IntegerField(default=0)
env_4 = models.IntegerField(default=0)
env_5 = models.IntegerField(default=0)
使用python自带的 getattr()、setattr()方法
# 过滤刚新建还没流转的发布单
orders = Order.objects.all().exclude(env_1=0, env_2=0, env_3=0, env_4=0, env_5=0)
for order in orders:
env_id = order.current_env
env_name = Environment.objects.filter(env_id=env_id)[0].env_name
# 变量名的变量,使得反射技术,
arg_name = "env_" + str(env_id)
arg_name_value = getattr(order, arg_name) ## 获取到值
## setattr(order, arg_name, 2) ## 设置对应的值