2017-08-14 89 views
0

我有一個自定義模型管理器和專門爲相關obj定義的自定義查詢集,這意味着我已經在模型中定義了Meta.base_manager_name。Django - Meta.base_manager_name - 使自定義查詢集和管理器中的相關參數

我想使用一個all()管理器方法,該方法在OneToOneFeild上獲取相關的obj。

現在我知道這是沒有意義的,因爲OneToOneFeild將總是返回一個obj,不需要使用all()方法。我正在研究django-oscar項目,並正在擴展其「合作伙伴」模式。它最初有一個帶有ManyToManyField的「用戶」字段,現在變成了OneToOneFeild。

用戶字段在代碼中使用關係user.partners.all()多次調用。我不想擴展/修改所有這些地方(我在這裏懶惰?),因爲我想保持代碼的升級友好性,所以我想讓所有()模型管理器定義哪些工作。不知道這是一個好主意嗎?

所有()方法需要用戶ARG回報用戶實例

class PartnerQuerySet(models.QuerySet): 
    def all(self, user): 
     return self.filter(user=user) 

class PartnerManager(models.Manager): 

    def get_queryset(self): 
     return PartnerQuerySet(self.model, using=self._db) 

    def all(self, user): 
     return self.get_queryset().all(users) 

class Partner(models.Model): 
    objects = PartnerManager() 

    class Meta: 
     base_manager_name = 'objects' 

問題是,當它被用來與相關OBJ,它要求用戶ARG這是有道理的,但因爲我使用它的查詢集與相關OBJ我想用相關的OBJ時ARG所以,

user.partner.all() - should use user as arg and fetch the results 

user.partner.all(user) - and I should not have to do the below 

2相關的問題: 1)這是否有道理 - 我應該這樣做呢? 2)我怎麼能在不增加ARG用戶

PS實現user.partner.all():我知道我可以用中間件工作get_current_user不過這個功能並不可靠,因爲每個部分的答覆上一個不同的問題在SO上。

回答

1

我不認爲你正在嘗試做什麼會工作。 OneToOneField的新情況爲您提供了合作伙伴實例。

>>>> user.partner 
<Partner xxx> 

而在舊的情況與ManyToManyField,在PartnerQuerySet將被退回所。

>>>> user.partner 
<PartnerQuerySet []> 

一個解決方案是創建一個自定義OneToOneField,但這很可能違反了「簡單比複雜好」的規則,到最後甚至可能比改變所有現有.all()的更多的工作。