Django глобальный фильтр - PullRequest
0 голосов
/ 17 января 2019

Есть ли способ глобальной фильтрации модели Django? Нам нужно установить фильтр в одном месте, чтобы он применялся во всех запросах, генерируемых Django ORM, включая поиск связанных объектов и т. Д. Пример:

class A(Model):
    n = IntegerField()

class B(Model):
    a = ForeignKey(A)

Мы хотим установить глобальный фильтр id__gte = 10 (статический, чтобы упростить его). Затем фильтр должен автоматически применяться и при выполнении связанных запросов, например,

B.objects.filter(a__n=123)  # this code cannot be modified

должен магическим образом расшириться до эквивалента

B.objects.filter(a__n=123, a__id__gte=10)

Мы можем изменить модели, менеджеры, наборы запросов, но мы не можем изменить код, к которому фактически запрашиваются объекты (много кода, сторонние приложения, универсальный API).

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы должны сделать собственный менеджер и изменить начальный QuerySet.Проверьте документы .

# First, define the Manager subclass.
class DahlBookManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(author='Roald Dahl')

# Then hook it into the Book model explicitly.
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # The default manager.
    dahl_objects = DahlBookManager() # The Dahl-specific manager.

Тогда вам следует использовать свой собственный менеджер (dahl_objects) вместо objects, и все запросы будут изменены.

Или вы можете переопределить objects сам менеджер

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = DahlBookManager() # The Dahl-specific manager
0 голосов
/ 17 января 2019

Как насчет создания представления в базе данных с фильтром и создания модели Django, указывающей на представление?

...