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