Метод get_queryset
Метод get_queryset применяется к классу административной
панели ModelAdmin и возвращает QuerySet, который будет
использоваться для отображения списка объектов в интерфейсе
администратора. Метод принимает параметр request,
что позволяет динамически изменять набор записей в зависимости
от текущего пользователя или других условий запроса.
Переопределение этого метода дает возможность гибко управлять
доступом к данным и фильтровать записи для разных групп
пользователей.
Синтаксис
class YourModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(...)
Пример
Давайте ограничим список статей в административной панели только теми, которые опубликованы:
from django.contrib import admin
from myapp.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'status', 'created_at')
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(status='published')
Теперь в административной панели у пользователя будут отображаться только статьи со статусом 'published'. Результат выполнения запроса:
[<Article: Первая статья>, <Article: Вторая статья>]
Пример
Давайте отфильтруем записи в зависимости от прав пользователя. Обычные пользователи видят только свои записи, а суперпользователи видят все записи:
from django.contrib import admin
from myapp.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'status')
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(author=request.user)
Результат выполнения кода для обычного пользователя:
[<Article: Моя первая статья>, <Article: Моя вторая статья>]
Результат выполнения кода для суперпользователя:
[<Article: Статья пользователя 1>, <Article: Статья пользователя 2>]
Пример
Используем метод get_queryset для сортировки записей
и применения выборки с помощью select_related для
оптимизации количества запросов к базе данных:
from django.contrib import admin
from myapp.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'created_at')
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.select_related('category').order_by('-created_at')
Теперь список статей будет отсортирован по дате создания в порядке убывания, а связанные категории будут подгружены одним дополнительным запросом:
[<Article: Новая статья>, <Article: Статья про Django>]
Смотрите также
-
класс
ModelAdmin,
который определяет интерфейс административной панели -
атрибут
list_display,
который управляет отображением полей в списке -
атрибут
list_filter,
который добавляет фильтры в боковую панель -
метод
save_model,
который переопределяет сохранение модели