python 全局变量 重载 错误 local variable referenced before assignment

python2.7 Django 1.8

概述:

当在函数外声明了全局变量,在函数内重新声明,就会覆盖函数外的全局变量,如果函数外或者其他函数对全局变量有引用,此时会导致错误local variable referenced before assignment出现

背景:

Django orm 采用代理模型继承和自定义管理器对默认模型拿到的queryset做了调整,为了使查到的数据都是调整后的queryset,默认视图函数头部引用调整后的代理模型。
但是需求发生了变更,需要调整后和调整前的queryset都能够根据参数做切换,此时很简单,想拿到两种queryset分别引用两种模型就行了(默认的和自己写的代理模型),但是!!!,视图函数py文件开头就引用了代理模型,函数体内再次根据收到的参数来引用同名的默认模型就会报错

解决方法:

函数体内global关键字声明好这个全局变量(模型名字),然后重新再定义这个全局变量为默认模型即可

代码示例:

# 视图函数
from models import InstanceNoPaas as Instance
from models import DiskNoPaas as Volume

    def func(request):
        show_paas = request.query_params.get('show_paas')
        if show_paas:
            global Volume
            global Instance

            from models import Instance as _vm
            from import Volume as _disk

            Volume = _disk
            Instance = _vm

# models

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    .......

# 修改管理器原始查询集:https://yiyibooks.cn/xx/django_182/topics/db/managers.html
class NewManager(models.Manager):
    def get_queryset(self):
        return super(DiskNoPaasManager, self).get_queryset().filter(条件)


# 代理模型继承加上自定义管理器
# 覆盖默认管理器:https://yiyibooks.cn/xx/django_182/topics/db/models.html#model-inheritance
class NewVolume(Volume):
    objects = NewManager()

    class Meta:
        proxy = True
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值