Django пользовательский набор запросов с предварительным фильтром

Есть ли в django способ написать пользовательский класс queryset, который имеет фильтр, "предварительно примененный" без необходимости вызова метода для него?

Я хочу создать менеджер, используя QuerySet.as_manager(). Но я хочу, чтобы этот менеджер автоматически отфильтровывал некоторые записи.

Django предлагает вам два способа написания таможенного менеджера для ваших моделей. Первый называется так : MyModel.objects.my_manager(). Последний называется так : MyModel.my_manager.all().

Я покажу вам последний, так как он прост в исполнении.

Предположим, что эта модель

class Post(models.Model):
    title = models.CharField(max_length=30, default='')
    description = models.CharField(max_length=30, default='')
    published = models.BooleanField(default=True)
    
    objects = models.Manager() # The default manager.
    published = PublishedManager() # Yur custom manager.

Теперь, чтобы иметь менеджер, который возвращает только published Пост :

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager,self).get_queryset()\
        .filter(published=True)

Отсюда вы можете сделать queryset следующим образом: published_posts = Post.published.all() Или применить к нему какой-нибудь фильтр, например: published_posts = Post.published.all().order_by('-title')

NB : Определение менеджера приходит раньше, чем модель Post.

Другой способ работы с менеджером Django Doc

Вернуться на верх