使用django作项目,在视图函数中须要查询,查询前构造一个查询参数的模型来过滤参数防止报错,而后调用模型的方法返回一个字典,包括了全部查询的字段和值,发现只要查询过一次以后,后续的访问查询结果会在以前的查询模型上修改,也就是在view中把模型实例化一次以后,后边的操做都会带着以前的痕迹,以下django
模型函数
class CmdbModel: base_model_dict = { "inst_id": "", "uuid": "", } model_dict = {} def __init__(self,partial, modify, except_keys = None, **kwargs): self.__set_model(partial= partial, modify= modify, **kwargs) if except_keys: for key in except_keys: self.model_dict.pop(key) def __set_model(self, partial=False, modify=False, **kwargs): pop_list = [key for key in self.model_dict] for k in self.model_dict: if k in kwargs: self.model_dict[k] = kwargs[k] pop_list.remove(k) if partial is True: for pop_key in pop_list: self.model_dict.pop(pop_key) if modify is True: if "inst_id" in self.model_dict: self.model_dict.pop("inst_id") def get_model(self): return self.model_dict class HostModel(CmdbModel): model_dict = dict({ "host_alias": "", "host_cpu": "", "host_disk": "", "host_health_info": "", "comment": "", "owner": "", "host_system": "", "host_env": "", }, **CmdbModel.base_model_dict)
调用ui
host_model = HostModel( partial=True, modify=False, **query_dict ) data,count = host_obj.list(start=start, limit=limit, **host_model.get_model())
就是这样spa
查了一下发现是由于模型的模块是使用form ... import ... 这样引入的,这样是单例模式证据就是在CmdbModel中增长一个类方法code
@classmethod def test(cls): print(cls.__init__)
打印结果以下orm
<function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598> <function CmdbModel.__init__ at 0x7f5c2cab9598>
看见了没,全部的init都是同一个地址,证实是单例模式blog
解决方法就是把self里面的成员不修改了,改为使用局部变量吧rem
不知道有没有办法强制不使用单例模式呢?get