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