Skip to content

Вьюхи на классах

RequestModel работает с Django class-based views без дополнительной настройки.

View-класс

from django.views import View
from django.http import JsonResponse

from .schema import ArticleCreateSchema


class ArticleView(View):

    def get(self, request):
        from .schema import ArticleListSchema
        params = ArticleListSchema(request)
        articles = Article.objects.filter(
            published=params.published,
        )[params.offset : params.offset + params.page_size]
        return JsonResponse({"results": list(articles.values())})

    def post(self, request):
        data = ArticleCreateSchema(request)
        article = Article.objects.create(
            title=data.title,
            body=data.body,
            author=request.user,
        )
        return JsonResponse({"id": article.pk}, status=201)

Detail-вьюха с URL-параметром

class ArticleDetailView(View):

    def get(self, request, pk):
        data = ArticleDetailSchema(request, pk=pk)
        article = Article.objects.get(pk=data.pk)
        return JsonResponse({"title": article.title})

    def patch(self, request, pk):
        data = ArticleUpdateSchema(request, pk=pk)
        Article.objects.filter(pk=data.pk).update(
            **data.model_dump(exclude={"pk"}, exclude_unset=True)
        )
        return JsonResponse({"ok": True})

    def delete(self, request, pk):
        Article.objects.filter(pk=pk).delete()
        return JsonResponse({}, status=204)

LoginRequiredMixin + валидация

from django.contrib.auth.mixins import LoginRequiredMixin


class ProfileUpdateView(LoginRequiredMixin, View):

    def post(self, request):
        data = ProfileUpdateSchema(request)
        request.user.profile.bio = data.bio
        request.user.profile.save()
        return JsonResponse({"ok": True})

Django REST Framework APIView

Если используешь DRF, RequestModel тоже работает. DRF оборачивает request.data, но django-pydantic-client читает из оригинальных request.body/request.POST/request.GET — поэтому всё прозрачно:

from rest_framework.views import APIView
from rest_framework.response import Response

from .schema import ProductCreateSchema


class ProductView(APIView):

    def post(self, request):
        data = ProductCreateSchema(request)  # читает из оригинального HttpRequest
        product = Product.objects.create(**data.model_dump())
        return Response({"id": product.pk}, status=201)

Note

DRF-объект request оборачивает оригинальный HttpRequest. django-pydantic-client обращается к request.body, request.GET и request.POST — все они доступны и через DRF-обёртку.