🔖 Справочник: команды и методы DRF-блока

🎯 Быстрый поиск К оглавлению урока

⚡ Топ-команды

pip install djangorestframework       # установка DRF
python manage.py runserver             # запуск сервера

# ORM — агрегация
Book.objects.aggregate(total=Count('id'), avg=Avg('price'))
Book.objects.values('author').annotate(cnt=Count('id'))
Book.objects.order_by('-price')[:5]

# DRF — сериализатор
serializer = BookSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()

# DRF — ViewSet + Router
router = DefaultRouter()
router.register(r'books', BookViewSet)

# query_params
request.query_params.get('author', '')

ORM — агрегация и аннотации

Метод / функцияОписаниеПример
aggregate(**kwargs)Вычисляет значения по всему QuerySet, возвращает словарьBook.objects.aggregate(n=Count('id'))
annotate(**kwargs)Добавляет вычисленное поле к каждому объекту.values('author').annotate(cnt=Count('id'))
Count(field)Количество записейCount('id')
Sum(field)Сумма значенийSum('price')
Avg(field)Среднее значениеAvg('price')
Min(field)Минимальное значениеMin('price')
Max(field)Максимальное значениеMax('price')
order_by(*fields)Сортировка; «-» — убывание.order_by('-price', 'title')
qs[start:stop]Срез QuerySet (LIMIT/OFFSET в SQL).all()[:10]
Subquery(qs)Подзапрос внутри QuerySetсм. examples.html
OuterRef(field)Ссылка на поле внешнего запросаOuterRef('author')
ExpressionWrapper(expr, output_field)Обёртка для сложного выражения с явным типомExpressionWrapper(F('a')/F('b'), FloatField())

DRF — сериализаторы

Метод / атрибутОписание
serializer.is_valid()Валидирует данные; возвращает True/False
serializer.is_valid(raise_exception=True)То же, но бросает ValidationError при ошибке
serializer.validated_dataСловарь с провалидированными данными
serializer.errorsСловарь с ошибками валидации
serializer.save()Вызывает create() или update()
serializer.dataСериализованное представление (для ответа)
Meta.fields = '__all__'Включить все поля модели
Meta.exclude = [...]Исключить указанные поля
Meta.read_only_fields = [...]Поля только для чтения
validate_<field>(value)Валидация отдельного поля
validate(data)Валидация нескольких полей одновременно

DRF — представления и статус-коды

ЭлементОписание
@api_view(['GET', 'POST'])Декоратор для FBV — указывает разрешённые HTTP-методы
Response(data, status=...)Ответ DRF с автоматическим content-negotiation
request.dataТело запроса (JSON → dict)
request.query_paramsGET-параметры запроса (аналог request.GET)
status.HTTP_200_OK200 — успешный GET
status.HTTP_201_CREATED201 — объект создан
status.HTTP_204_NO_CONTENT204 — успешное удаление
status.HTTP_400_BAD_REQUEST400 — ошибка валидации
status.HTTP_404_NOT_FOUND404 — объект не найден

DRF — Generic views

КлассМетодыТипичный URL
ListAPIViewGET/books/
CreateAPIViewPOST/books/
ListCreateAPIViewGET, POST/books/
RetrieveAPIViewGET/books/<pk>/
UpdateAPIViewPUT, PATCH/books/<pk>/
DestroyAPIViewDELETE/books/<pk>/
RetrieveUpdateDestroyAPIViewGET, PUT, PATCH, DELETE/books/<pk>/
ModelViewSetGET, POST, PUT, PATCH, DELETE/books/ + /books/<pk>/

DRF — Router

from rest_framework.routers import DefaultRouter
from .views import BookViewSet

router = DefaultRouter()
router.register(r'books', BookViewSet, basename='book')

# В urls.py:
urlpatterns = router.urls
# Генерирует автоматически:
# GET  /books/          -> list
# POST /books/          -> create
# GET  /books/{pk}/     -> retrieve
# PUT  /books/{pk}/     -> update
# PATCH /books/{pk}/    -> partial_update
# DELETE /books/{pk}/   -> destroy