⚡ Шпаргалка
# ModelViewSet — полный CRUD
class XViewSet(viewsets.ModelViewSet):
queryset = X.objects.all()
serializer_class = XSerializer
# DefaultRouter
router = DefaultRouter()
router.register(r'url-prefix', XViewSet)
urlpatterns = [path('', include(router.urls))]
# Generic Views с двумя сериализаторами
class XListCreateView(ListCreateAPIView):
queryset = X.objects.all()
def get_serializer_class(self):
return XSerializer if self.request.method == 'GET' else XCreateSerializer
class XDetailView(RetrieveUpdateDestroyAPIView):
queryset = X.objects.all()
def get_serializer_class(self):
return XSerializer if self.request.method == 'GET' else XCreateSerializer
# URL для Generic Views
urlpatterns = [
path('items/', XListCreateView.as_view()),
path('items/<int:pk>/', XDetailView.as_view()),
]
# DjangoFilterBackend
filter_backends = [DjangoFilterBackend]
filterset_fields = ['field1', 'field2']
ModelViewSet
| Атрибут/метод |
Назначение |
queryset |
Набор объектов, с которыми работает ViewSet |
serializer_class |
Сериализатор по умолчанию |
get_serializer_class() |
Переопределяет сериализатор динамически |
filter_backends |
Список бэкендов фильтрации |
filterset_fields |
Поля, доступные для фильтрации |
DefaultRouter: генерируемые URL
После router.register(r'items', ItemViewSet) создаются:
| URL |
Метод |
Действие |
/items/ |
GET |
Список объектов (list) |
/items/ |
POST |
Создание (create) |
/items/{pk}/ |
GET |
Получение объекта (retrieve) |
/items/{pk}/ |
PUT |
Полное обновление (update) |
/items/{pk}/ |
PATCH |
Частичное обновление (partial_update) |
/items/{pk}/ |
DELETE |
Удаление (destroy) |
Generic Views — классы
| Класс |
HTTP методы |
Действие |
ListCreateAPIView |
GET, POST |
Список + создание |
RetrieveUpdateDestroyAPIView |
GET, PUT, PATCH, DELETE |
Деталь + обновление + удаление |
ListAPIView |
GET |
Только список (read-only) |
RetrieveAPIView |
GET |
Только деталь (read-only) |
DjangoFilterBackend — установка и настройка
# 1. Установка
pip install django-filter
# 2. settings.py
INSTALLED_APPS = [
...
'django_filters',
]
# 3. views.py
from django_filters.rest_framework import DjangoFilterBackend
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['category', 'price']
# 4. Использование
# GET /api/products/?category=2
# GET /api/products/?category=2&price=100