使用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