> Какие инструменты DRF и Django использовать для реализации бизнес-логики сохранения заказа? (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: ФедяИСамат

Стек: Python

> Пример ответа

Для реализации бизнес-логики сохранения заказа в Django REST Framework (DRF) я использую комбинацию сериализаторов с переопределённым методом create() или update(), а также сигналов Django для побочных эффектов. Основной подход - инкапсулировать логику в сериализаторе, чтобы сохранить её в одном месте и избежать дублирования.

Пример: при создании заказа нужно проверить доступность товаров, рассчитать итоговую сумму и обновить складские остатки. В сериализаторе OrderSerializer я переопределяю метод create():

PYTHON
class OrderSerializer(serializers.ModelSerializer):
items = OrderItemSerializer(many=True)
class Meta:
model = Order
fields = ['id', 'user', 'items', 'total']
def create(self, validated_data):
items_data = validated_data.pop('items')
# Бизнес-логика: проверка наличия и расчёт суммы
total = 0
for item_data in items_data:
product = item_data['product']
if product.stock < item_data['quantity']:
raise serializers.ValidationError(f"Недостаточно товара {product.name}")
total += product.price * item_data['quantity']
validated_data['total'] = total
order = Order.objects.create(**validated_data)
# Создание позиций заказа и обновление остатков
for item_data in items_data:
OrderItem.objects.create(order=order, **item_data)
product = item_data['product']
product.stock -= item_data['quantity']
product.save()
return order

Если логика сложная (например, интеграция с внешними сервисами или транзакционные операции), я выношу её в сервисный слой - отдельный класс или функцию, вызываемую из сериализатора. Это улучшает тестируемость. Также использую транзакции (transaction.atomic()) для атомарности операций.

Для фоновых задач (например, отправка email после сохранения) применяю сигналы (post_save) или Celery, чтобы не блокировать ответ API.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью