Метод get_queryset
Метод get_queryset применяется в классах представлений списка
и возвращает объект QuerySet, содержащий записи, которые будут
отображены на странице. По умолчанию он возвращает все объекты
модели, указанной в атрибуте model или queryset.
Метод можно переопределить для кастомизации выборки данных,
включая фильтрацию, сортировку или дополнительную логику.
Синтаксис
from django.views.generic import ListView
from myapp.models import Article
class ArticleListView(ListView):
model = Article
def get_queryset(self):
return super().get_queryset().filter(status='published')
Пример
Давайте создадим представление, которое возвращает только опубликованные статьи:
from django.views.generic import ListView
from myapp.models import Article
class PublishedArticlesView(ListView):
model = Article
template_name = 'articles/published_list.html'
context_object_name = 'articles'
def get_queryset(self):
return Article.objects.filter(status='published')
Пример
Давайте переопределим метод для сортировки статей по дате создания в обратном порядке:
from django.views.generic import ListView
from myapp.models import Article
class RecentArticlesView(ListView):
model = Article
template_name = 'articles/recent_list.html'
context_object_name = 'recent_articles'
def get_queryset(self):
return Article.objects.order_by('-created_at')[:10]
Пример
Давайте используем параметры запроса для динамической фильтрации статей по категории:
from django.views.generic import ListView
from myapp.models import Article
class CategoryArticlesView(ListView):
model = Article
template_name = 'articles/category_list.html'
context_object_name = 'articles'
def get_queryset(self):
queryset = super().get_queryset()
category = self.request.GET.get('category')
if category:
queryset = queryset.filter(category__name=category)
return queryset
Пример
Давайте реализуем поиск по названию статьи с использованием параметра запроса:
from django.views.generic import ListView
from django.db.models import Q
from myapp.models import Article
class SearchArticlesView(ListView):
model = Article
template_name = 'articles/search_list.html'
context_object_name = 'articles'
def get_queryset(self):
queryset = super().get_queryset()
search_query = self.request.GET.get('search')
if search_query:
queryset = queryset.filter(
Q(title__icontains=search_query) |
Q(content__icontains=search_query)
)
return queryset
Смотрите также
-
класс
ListView,
который представляет список объектов -
метод
filter,
который фильтруетQuerySetпо заданным условиям -
метод
order_by,
который сортируетQuerySetпо указанным полям -
метод
exclude,
который исключает записи изQuerySet