2011-06-26 58 views
0

我要重寫的特定型號的objects.all()基於信息的行爲是在會話中,我不知道如何在這一點上獲取會話數據的請求數據覆蓋Django的的object.all()與

感謝

編輯 只是更多的是什麼/爲什麼IM這樣的解釋了一下。我們有一個項目,但希望根據用戶登錄的內容將過濾器應用於用戶可以看到的內容。所以它可以影響「all()」的工作方式。我們的項目已經建成,我們正在修改它,所以我們不想通過並更改所有objects.all()並添加請求。希望這將清除的東西了

回答

-2

你應該做一個方法上的自定義管理器,爲的是:

from django.db import models 

class MyManager(models.Manager): 
    def all(self, session=None): 
     if session is None: 
      return self.all() 
     else: 
      return self.filter(.....) 

class MyModel(models.Model): 
    # fields go here 
    objects = MyManager() 

雖然這可能不是推薦的方法,因爲它是不斷變化的all()可能有一些行爲意想不到的效果在你的應用的其他部分! 另外,您既可以一個新的方法添加到管理員爲了這個目的,或者做一些額外的過濾視圖:

# code in the view 
qs = MyModel.objects.all() 
if session....: 
    qs = qs.filter(...) 

但你總是需要必要的數據,以您的過濾方法!考慮這個方法也可能從一個無法訪問請求/會話數據的位置(例如shell)調用,因此一個好的體系結構要求這樣!

+0

我現在編輯了這個問題,我們想實現這個,所以它工作在不可見的狀態,所以我們不必改變一些已經寫好的代碼。這可能必須是我們的解決方案!感謝您的回答 – neolaser

+1

這將進入一個無限遞歸調用,'all'調用'all'。 – Gocht