我实现此目标的方法是将实际值添加
get_active_for_account为自定义方法
QuerySet。然后,要使其脱离管理器,你只需捕获
__getattr__并相应地将其返回
为了使该模式可重用,我将这些
Manager位提取到单独的模型管理器中:
custom_queryset / models.py
from django.db import modelsfrom django.db.models.query import QuerySetclass CustomQuerySetManager(models.Manager): """A re-usable Manager to access a custom QuerySet""" def __getattr__(self, attr, *args): try: return getattr(self.__class__, attr, *args) except AttributeError: # don't delegate internal methods to the queryset if attr.startswith('__') and attr.endswith('__'): raise return getattr(self.get_query_set(), attr, *args) def get_query_set(self): return self.model.QuerySet(self.model, using=self._db)一旦掌握了这些,就可以在模型上将QuerySeta定义为自定义内部类,并将管理器设置为自定义管理器:
your_app / models.py
from custom_queryset.models import CustomQuerySetManagerfrom django.db.models.query import QuerySetclass Inquiry(models.Model): objects = CustomQuerySetManager() class QuerySet(QuerySet): def active_for_account(self, account, *args, **kwargs): return self.filter(account=account, deleted=False, *args, **kwargs)
使用这种模式,以下任何一种都可以工作:
>>> Inquiry.objects.active_for_account(user)>>> Inquiry.objects.all().active_for_account(user)>>> Inquiry.objects.filter(first_name='John').active_for_account(user)
如果你将UPD与自定义用户(AbstractUser)一起使用,则需要
从
class CustomQuerySetManager(models.Manager):
至
from django.contrib.auth.models import UserManagerclass CustomQuerySetManager(UserManager): ***



