Django изменился! Перед использованием кода в этом ответе, который был написан в 2009 году, обязательно ознакомьтесь с остальными ответами и документацией по Django, чтобы увидеть, есть ли более подходящее решение .
Я реализовал это путем добавления фактического get_active_for_account
в качестве метода пользовательского QuerySet
. Затем, чтобы заставить его работать без менеджера, вы можете просто перехватить __getattr__
и вернуть его соответственно
Чтобы этот шаблон можно было использовать повторно, я извлек Manager
биты в отдельный менеджер моделей:
custom_queryset / models.py
from django.db import models
from django.db.models.query import QuerySet
class 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)
Как только вы это получите, в ваших моделях все, что вам нужно сделать, это определить QuerySet
как собственный внутренний класс и установить менеджера в свой собственный менеджер:
your_app / models.py
from custom_queryset.models import CustomQuerySetManager
from django.db.models.query import QuerySet
class 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 UserManager
class CustomQuerySetManager(UserManager):
***