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

Где лучше расположить логику в моделях или сериализаторе

1️⃣ Как кратко ответить

Логику, связанную с бизнес-правилами и валидацией данных, лучше размещать в моделях, так как они представляют собой слой данных и бизнес-логики. Сериализаторы же предназначены для преобразования данных между сложными типами Python и форматами, такими как JSON, и должны содержать логику, связанную с представлением данных. Это разделение обязанностей помогает поддерживать код чистым и легко поддерживаемым.

2️⃣ Подробное объяснение темы

Модели

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

from django.db import models
​
class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.IntegerField()
​
    def apply_discount(self, percentage):
        return self.price * (1 - percentage / 100)

Сериализаторы

Сериализаторы в Django REST Framework используются для преобразования сложных типов данных, таких как объекты моделей, в простые форматы, такие как JSON, и обратно. Они также могут выполнять валидацию данных, но их основная задача — это преобразование данных для передачи по сети.

from rest_framework import serializers
​
class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['name', 'price', 'stock']

Где размещать логику?

  • Бизнес-логика и валидация данных: Эти аспекты лучше всего размещать в моделях. Модели представляют собой слой данных и бизнес-логики, и они должны быть ответственны за поддержание целостности данных. Например, если у вас есть сложные правила расчета цены или проверки доступности, это должно быть в модели.

  • Логика представления данных: Сериализаторы должны содержать логику, связанную с преобразованием данных для передачи по сети. Например, если вам нужно изменить формат даты или объединить несколько полей в одно, это можно сделать в сериализаторе.

Пример

Представьте, что у вас есть приложение для интернет-магазина. Вы хотите, чтобы пользователи могли видеть цену товара с учетом скидки. Логика расчета скидки должна находиться в модели, так как это бизнес-логика:

class Product(models.Model):
    # ...
​
    def get_discounted_price(self, discount):
        return self.price * (1 - discount / 100)

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

class ProductSerializer(serializers.ModelSerializer):
    discounted_price = serializers.SerializerMethodField()
​
    class Meta:
        model = Product
        fields = ['name', 'price', 'discounted_price']
​
    def get_discounted_price(self, obj):
        return obj.get_discounted_price(10)  # Пример использования 10% скидки

Зачем это нужно?

Разделение логики между моделями и сериализаторами помогает поддерживать код чистым и легко поддерживаемым. Модели отвечают за бизнес-логику и целостность данных, а сериализаторы — за преобразование данных для передачи по сети. Это разделение обязанностей делает код более понятным и упрощает его тестирование и поддержку.

Тема: Django
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки