Как Вы создаете пользовательские полевые поиски в Django?
При фильтрации querysets, django обеспечивает ряд поисков, которые можно использовать: __contains
, __iexact
, __in
, и т.д. Я хочу быть в состоянии предоставить новый поиск своему менеджеру, так например, кто-то мог сказать:
twentysomethings = Person.objects.filter(age__within5=25)
и возвратитесь весь Person
объекты с возрастом между 20 и 30. Сделайте я должен разделить на подклассы QuerySet
или Manager
класс, чтобы сделать это? Как это было бы реализовано?
Более гибкий способ сделать это - написать собственный QuerySet, а также пользовательский менеджер. Работа с кодом ozan:
class PersonQuerySet(models.query.QuerySet):
def in_age_range(self, min, max):
return self.filter(age__gte=min, age__lt=max)
class PersonManager(models.Manager):
def get_query_set(self):
return PersonQuerySet(self.model)
def __getattr__(self, name):
return getattr(self.get_query_set(), name)
class Person(models.Model):
age = #...
objects = PersonManager()
Это позволяет вам связать ваш собственный запрос. Таким образом, оба этих запроса будут действительными:
Person.objects.in_age_range(20,30)
Person.objects.exclude(somefield = some_value).in_age_range(20, 30)
Вместо создания поиска полей, лучшей практикой было бы создание метода менеджера, который мог бы выглядеть немного так:
class PersonManger(models.Manager):
def in_age_range(self, min, max):
return self.filter(age__gte=min, age__lt=max)
class Person(models.Model):
age = #...
objects = PersonManager()
тогда использование было бы так:
twentysomethings = Person.objects.in_age_range(20, 30)