Создание пользовательских Полевых Поисков в Django

Как Вы создаете пользовательские полевые поиски в Django?

При фильтрации querysets, django обеспечивает ряд поисков, которые можно использовать: __contains, __iexact, __in, и т.д. Я хочу быть в состоянии предоставить новый поиск своему менеджеру, так например, кто-то мог сказать:

twentysomethings = Person.objects.filter(age__within5=25)

и возвратитесь весь Person объекты с возрастом между 20 и 30. Сделайте я должен разделить на подклассы QuerySet или Manager класс, чтобы сделать это? Как это было бы реализовано?

11
задан jcdyer 4 February 2010 в 20:59
поделиться

2 ответа

Более гибкий способ сделать это - написать собственный 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)
12
ответ дан 3 December 2019 в 04:13
поделиться

Вместо создания поиска полей, лучшей практикой было бы создание метода менеджера, который мог бы выглядеть немного так:

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)
6
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: