2016-10-31 70 views
0

我有2classes ABPython:如何繼承和重寫有查詢集的方法?

class A(ListView): 
     model=Model_name 
     def get_queryset(self): 
      instance = self.get_user_by_credential(...) 
      if instance: 
       model_instance = self.model.objects.get(id=instance.id) 
       some_objects= self.Model_name.objects.filter(content_id=5, object_id=model_instance.id) 
       return some_objects 
      return [] 



class B(A,UserObject): 
     model=B_model 
     param='foo' 
     def get_queryset(self): 
      instance = self.get_user_by_credential(...) 
      if instance: 
       model_instance = self.model.objects.get(id=instance.id, param=param) 
       some_objects= Model_name.objects.filter(content_id=5, object_id=model_instance.id) 
       return some_objects 
      return [] 

我如何可以覆蓋A父類的方法,並添加參數的2類之間的差別僅僅是在B

的查詢集的param到子類B的查詢集?

+0

我不建議作爲不明白你爲什麼得到帶有用戶對象ID的B_model對象。你怎麼知道他們會有相同的ID? –

+0

我有很多用戶配置文件..我必須獲取當前活動用戶的model_object –

+0

要獲取當前登錄用戶的模型對象,請使用'request.user';否則你就有一個安全漏洞,任何人都可以通過簡單地在查詢字符串中嘗試不同的ID來查看其他用戶的數據。 –

回答

2

你可以只讓一個get_model_instance方法,然後使用在A裏面執行,這樣就可以刪除B.

def get_model_instance(self): 
    instance = self.get_user_by_credential(...) 
    if instance: 
     return self.model.objects.get(id=instance.id) 
    return None 

def get_model_instance(self): 
    instance = self.get_user_by_credential(...) 
    if instance: 
     return self.model.objects.get(id=instance.id, param=param) 
    return None 

,或者實現由丹尼爾·羅斯曼

def get_model_instance(self, instance): 
    ... 
+0

感謝您的回答,Bur'instance.id'來自'if .. else'語句。我不能用另一種方法做出來。 –

+0

@pietà - 將其移至獲取實例 – Sayse

+1

或者將其保存在'get_queryset'中,但將其作爲參數傳遞給'get_model_instance'。 –