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

Какой самый частый тип сериалайзера применяется в Django ORM?

2.0 Middle🔥 171 комментариев
#Django#Базы данных (SQL)

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

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

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

Самый частый тип сериализатора в Django ORM

Важное уточнение: Django ORM сам по себе не работает с сериализаторами. Это задача Django REST Framework (DRF) — отдельного пакета для создания REST API. Разберу оба контекста.

В Django REST Framework — ModelSerializer

ModelSerializer — это самый часто используемый тип сериализатора в экосистеме Django при работе с ORM моделями. Это основной инструмент для преобразования моделей Django в JSON и обратно.

from django.db import models
from rest_framework import serializers

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey('User', on_delete=models.CASCADE)

    class Meta:
        db_table = 'posts'

# Самый частый способ — ModelSerializer
class PostSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source='author.username', read_only=True)
    
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'created_at', 'author', 'author_name']
        read_only_fields = ['id', 'created_at']

Почему именно ModelSerializer?

1. Автоматическое выведение полей:

# Вместо того чтобы писать каждый field вручную
class PostSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    title = serializers.CharField(max_length=200)
    content = serializers.CharField()
    created_at = serializers.DateTimeField()
    author = serializers.IntegerField()

# ModelSerializer делает это автоматически
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'  # или ['id', 'title', 'content', ...]

2. Валидация совпадает с моделью:

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = ['id', 'text', 'post']
        # Автоматически берёт валидаторы из модели
        # max_length, blank=True, null=True и т.д.

3. Встроенные методы create() и update():

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['title', 'content']
    
    # Не нужно писать это вручную
    # def create(self, validated_data):
    #     return Post.objects.create(**validated_data)
    # 
    # def update(self, instance, validated_data):
    #     instance.title = validated_data.get('title', instance.title)
    #     instance.save()
    #     return instance

Использование в практике

Простой CRUD с viewsets:

from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    
    # GET /api/posts/ — list()
    # POST /api/posts/ — create()
    # GET /api/posts/{id}/ — retrieve()
    # PUT /api/posts/{id}/ — update()
    # DELETE /api/posts/{id}/ — destroy()

Контролируемое выведение полей:

class DynamicFieldsSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        # GET /api/posts/?fields=id,title
        request = self.context.get('request')
        if request:
            fields = request.query_params.get('fields')
            if fields:
                allowed = set(fields.split(','))
                existing = set(self.fields.keys())
                for field_name in existing - allowed:
                    self.fields.pop(field_name)

class PostSerializer(DynamicFieldsSerializer):
    class Meta:
        model = Post
        fields = '__all__'

Другие типы сериализаторов (реже используются)

1. Serializer (базовый) — для сложной логики:

class CustomSerializer(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.IntegerField()
    
    def validate_age(self, value):
        if value < 0:
            raise serializers.ValidationError("Age cannot be negative")
        return value

2. ListSerializer — для работы с коллекциями:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'
        list_serializer_class = CustomListSerializer  # Редко нужно

3. HyperlinkedModelSerializer — со ссылками вместо ID:

class PostSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Post
        fields = ['url', 'id', 'title']  # url вместо id для author
        extra_kwargs = {
            'url': {'view_name': 'post-detail'}
        }

Жизненный цикл ModelSerializer

# 1. Инициализация
serializer = PostSerializer(data=request.data)

# 2. Валидация
if serializer.is_valid():  # Вызывает validate() методы
    # 3. Сохранение
    post = serializer.save()  # Вызывает create() или update()
    return Response(serializer.data, status=201)
else:
    return Response(serializer.errors, status=400)

Лучшие практики

  1. Разделяй сериализаторы для чтения и записи:
class PostDetailSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    comments = CommentSerializer(many=True, read_only=True)
    
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'author', 'comments']

class PostCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['title', 'content']
  1. Избегай N+1 запросов — используй select_related и prefetch_related:
class PostViewSet(viewsets.ModelViewSet):
    serializer_class = PostDetailSerializer
    
    def get_queryset(self):
        return Post.objects.select_related('author').prefetch_related('comments')
  1. Переопределяй методы для кастомной логики:
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['title', 'content']
    
    def create(self, validated_data):
        validated_data['author'] = self.context['request'].user
        return super().create(validated_data)

Итог: ModelSerializer — это 80% всех сериализаторов в Django REST Framework приложениях. Он экономит код, автоматизирует валидацию и интегрируется прямо с ORM моделями.

Какой самый частый тип сериалайзера применяется в Django ORM? | PrepBro