Метод get_queryset

Метод get_queryset применяется к классу административной панели ModelAdmin и возвращает QuerySet, который будет использоваться для отображения списка объектов в интерфейсе администратора. Метод принимает параметр request, что позволяет динамически изменять набор записей в зависимости от текущего пользователя или других условий запроса. Переопределение этого метода дает возможность гибко управлять доступом к данным и фильтровать записи для разных групп пользователей.

Синтаксис

pythonclass YourModelAdmin(admin.ModelAdmin):
  def get_queryset(self, request):
    qs = super().get_queryset(request)
    return qs.filter(...)

Пример

Давайте ограничим список статей в административной панели только теми, которые опубликованы:

pythonfrom 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'. Результат выполнения запроса:

python[<Article: Первая статья>, <Article: Вторая статья>]

Пример

Давайте отфильтруем записи в зависимости от прав пользователя. Обычные пользователи видят только свои записи, а суперпользователи видят все записи:

pythonfrom 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)

Результат выполнения кода для обычного пользователя:

python[<Article: Моя первая статья>, <Article: Моя вторая статья>]

Результат выполнения кода для суперпользователя:

python[<Article: Статья пользователя 1>, <Article: Статья пользователя 2>]

Пример

Используем метод get_queryset для сортировки записей и применения выборки с помощью select_related для оптимизации количества запросов к базе данных:

pythonfrom 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')

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

python[<Article: Новая статья>, <Article: Статья про Django>]

Смотрите также

  • класс ModelAdmin,
    который определяет интерфейс административной панели
  • атрибут list_display,
    который управляет отображением полей в списке
  • атрибут list_filter,
    который добавляет фильтры в боковую панель
  • метод save_model,
    который переопределяет сохранение модели