← Назад к вопросам

Какие используешь классы в Django?

1.0 Junior🔥 271 комментариев
#Django#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Классы в Django Framework

Django предоставляет множество встроенных классов для ускорения разработки веб-приложений. Вот основные, которые я использую регулярно.

1. Model Classes

models.Model — базовый класс для всех моделей данных:

from django.db import models
from django.utils import timezone

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_published = models.BooleanField(default=False)
    
    class Meta:
        ordering = ["-created_at"]
        indexes = [
            models.Index(fields=["is_published", "-created_at"]),
        ]
    
    def __str__(self):
        return self.title

2. View Classes

Class-Based Views (CBV) предоставляют переиспользуемую логику:

from django.views.generic import ListView, DetailView, CreateView
from django.contrib.auth.mixins import LoginRequiredMixin

class ArticleListView(ListView):
    model = Article
    template_name = "articles/list.html"
    paginate_by = 20
    
    def get_queryset(self):
        return Article.objects.filter(is_published=True)

class ArticleDetailView(DetailView):
    model = Article
    template_name = "articles/detail.html"

class ArticleCreateView(LoginRequiredMixin, CreateView):
    model = Article
    fields = ["title", "content"]
    
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

3. Form Classes

forms.ModelForm для работы с моделями:

from django import forms

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ["title", "content", "tags"]
        widgets = {
            "title": forms.TextInput(attrs={"class": "form-control"}),
            "content": forms.Textarea(attrs={"class": "form-control", "rows": 10}),
        }
    
    def clean_title(self):
        title = self.cleaned_data.get("title")
        if len(title) < 5:
            raise forms.ValidationError("Минимум 5 символов")
        return title

4. Serializer Classes (DRF)

Serializers для REST API:

from rest_framework.serializers import ModelSerializer

class AuthorSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ["id", "username", "email"]

class ArticleSerializer(ModelSerializer):
    author = AuthorSerializer(read_only=True)
    
    class Meta:
        model = Article
        fields = ["id", "title", "content", "author", "created_at"]
        read_only_fields = ["created_at"]

5. ViewSet Classes (DRF)

ViewSets для CRUD операций:

from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.decorators import action

class ArticleViewSet(ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]
    
    def perform_create(self, serializer):
        serializer.save(author=self.request.user)
    
    @action(detail=True, methods=["post"])
    def publish(self, request, pk=None):
        article = self.get_object()
        article.is_published = True
        article.save()
        return Response({"status": "published"})

6. Manager и QuerySet

Кастомные менеджеры для часто используемых запросов:

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_published=True)

class Article(models.Model):
    objects = models.Manager()
    published = PublishedManager()

# Использование
published = Article.published.all()

Django классы обеспечивают мощный и гибкий фреймворк для разработки веб-приложений.

Какие используешь классы в Django? | PrepBro