記一次詭異的bug

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

相關文章
相關標籤/搜索