我有一個自定義模型管理器和專門爲相關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上。