10 промтов для Django: от моделей до REST API

Введение

Разработка на Django — это постоянная работа с моделями, представлениями, сериализаторами и админкой. Даже опытные бэкенд-разработчики тратят время на шаблонный код (boilerplate). Современные языковые модели (LLM) могут сгенерировать основу за секунды, если правильно составить промт. Эта подборка — готовая шпаргалка из 10 проверенных промтов, которые помогут ускорить рутину: от описания модели до настройки REST API. Все промты предполагают, что вы используете Django 5.x и Django REST Framework 3.15+. Перед копированием кода обязательно адаптируйте имена и параметры под свой проект — AI может ошибаться в деталях (например, в типах полей или импортах).


1. Генерация модели с полями и мета-опциями

Задача: Создать модель Order с типичными полями: клиент, дата, статус, сумма. Хочется увидеть готовый код с Meta, __str__ и get_absolute_url.

Промт:

Напиши модель Django для заказа. Поля: customer (ForeignKey на User), created_at (DateTimeField, auto_now_add), status (CharField с choices: 'pending', 'paid', 'shipped', 'cancelled'), total (DecimalField, max_digits=10, decimal_places=2). Добавь class Meta с ordering = ['-created_at'], verbose_name и verbose_name_plural. Реализуй __str__ и get_absolute_url. Используй Python 3.12 и Django 5.0.

Пример использования: Скопируйте промт в ChatGPT или Claude, замените название модели и поля под свою предметную область. На выходе — готовый класс, который остаётся вставить в models.py и сделать миграцию. Итоговый код:

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse

class Order(models.Model):
    class Status(models.TextChoices):
        PENDING = 'pending', 'Pending'
        PAID = 'paid', 'Paid'
        SHIPPED = 'shipped', 'Shipped'
        CANCELLED = 'cancelled', 'Cancelled'

    customer = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING)
    total = models.DecimalField(max_digits=10, decimal_places=2)

    class Meta:
        ordering = ['-created_at']
        verbose_name = 'Order'
        verbose_name_plural = 'Orders'

    def __str__(self):
        return f'Order {self.id} by {self.customer}'

    def get_absolute_url(self):
        return reverse('order_detail', kwargs={'pk': self.pk})

2. Сериализатор DRF для модели

Задача: Быстро получить сериализатор OrderSerializer с валидацией и поддержкой вложенных объектов (например, связи customer как UserSerializer).

Промт:

Создай Django REST Framework сериализатор для модели Order (из предыдущего кода). Поле customer должно отображаться как строковое представление (read-only), а total — read-only, если статус не 'pending'. Добавь валидацию: total должен быть > 0. Используй ModelSerializer. Python 3.12, DRF 3.15.

Пример использования: Добавьте импорт модели и создайте сериализатор по аналогии. Полученный код:

from rest_framework import serializers
from .models import Order

class OrderSerializer(serializers.ModelSerializer):
    customer_name = serializers.CharField(source='customer.username', read_only=True)

    class Meta:
        model = Order
        fields = ['id', 'customer', 'customer_name', 'created_at', 'status', 'total']
        read_only_fields = ['created_at', 'customer_name']

    def validate_total(self, value):
        if value <= 0:
            raise serializers.ValidationError('Total must be positive')
        if self.instance and self.instance.status != 'pending':
            raise serializers.ValidationError('Cannot change total after payment')
        return value

3. ViewSet для REST API (CRUD)

Задача: Полноценный ViewSet с фильтрацией, поиском и пагинацией для модели Order. Только для авторизованных пользователей.

Промт:

Напиши ModelViewSet для модели Order с permission IsAuthenticated. Реализуй фильтр по статусу (поле status) и поиск по id и customer__username. Используй DefaultPagination с размером страницы 20. Django REST Framework 3.15.

Пример получения:

from rest_framework import viewsets, filters, pagination
from .models import Order
from .serializers import OrderSerializer

class OrderPagination(pagination.PageNumberPagination):
    page_size = 20

class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.select_related('customer').all()
    serializer_class = OrderSerializer
    permission_classes = [permissions.IsAuthenticated]
    pagination_class = OrderPagination
    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['id', 'customer__username']
    ordering_fields = ['created_at', 'total']

    def get_queryset(self):
        qs = super().get_queryset()
        status = self.request.query_params.get('status')
        if status:
            qs = qs.filter(status=status)
        return qs

4. Кастомный менеджер модели с QuerySet

Задача: Добавить к модели Order менеджер с методом pending() и paid(), чтобы писать Order.objects.pending().

Промт:

Создай кастомный менеджер и QuerySet для модели Order. QuerySet должен содержать методы pending() и paid(), которые фильтруют по статусу. Менеджер OrderManager должен использовать этот QuerySet. Django 5.0.

Пример кода:

from django.db import models

class OrderQuerySet(models.QuerySet):
    def pending(self):
        return self.filter(status='pending')

    def paid(self):
        return self.filter(status='paid')

class OrderManager(models.Manager):
    def get_queryset(self):
        return OrderQuerySet(self.model, using=self._db)

    def pending(self):
        return self.get_queryset().pending()

    def paid(self):
        return self.get_queryset().paid()

# В модели: objects = OrderManager()

5. Админ-класс с кастомизацией

Задача: Настроить админку для Order: поля списка, фильтры, поиск, действия (например, пометить как оплачено).

Промт:

Создай ModelAdmin для Order в Django admin. list_display: id, customer, status, total, created_at. list_filter: status, created_at. search_fields: customer__username. Добавь action 'mark_as_paid' который меняет статус на 'paid'. Используй date_hierarchy = 'created_at'.

Пример вывода:

from django.contrib import admin
from .models import Order

def mark_as_paid(modeladmin, request, queryset):
    queryset.update(status='paid')
mark_as_paid.short_description = "Mark selected orders as paid"

@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ['id', 'customer', 'status', 'total', 'created_at']
    list_filter = ['status', 'created_at']
    search_fields = ['customer__username']
    date_hierarchy = 'created_at'
    actions = [mark_as_paid]

6. Сигнал post_save для уведомлений

Задача: При создании заказа отправлять email клиенту и обновлять инвентарь.

Промт:

Напиши сигнал post_save для модели Order. При создании (created=True) вызывай задачу отправки email (через Django signals) и функцию уменьшения количества товара на складе (предположим, модель Product с полем stock). Используй @receiver. Django 5.0.

Пример кода (упрощённо):

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Order

def send_order_email(order):
    # логика отправки
    pass

def decrease_stock(order):
    for item in order.items.all():
        item.product.stock -= item.quantity
        item.product.save()

@receiver(post_save, sender=Order)
def order_post_save(sender, instance, created, **kwargs):
    if created:
        send_order_email(instance)
        decrease_stock(instance)

7. Data migration для заполнения начальных данных

Задача: Перенести данные из старой таблицы или создать тестовые заказы.

Промт:

Создай пустую миграцию Django (python manage.py makemigrations --empty) и напиши в ней функцию data_migration, которая создаёт 10 тестовых заказов для пользователя с id=1. Используй Faker для генерации случайных сумм. Django 5.0, библиотека faker.

Пример миграции:

from django.db import migrations
from faker import Faker

def create_test_orders(apps, schema_editor):
    Order = apps.get_model('myapp', 'Order')
    User = apps.get_model('auth', 'User')
    fake = Faker()
    user = User.objects.get(pk=1)
    for _ in range(10):
        Order.objects.create(
            customer=user,
            total=round(fake.random_number(digits=4), 2),
            status='pending'
        )

class Migration(migrations.Migration):
    dependencies = [('myapp', '0001_initial')]
    operations = [
        migrations.RunPython(create_test_orders),
    ]

8. Тесты для модели и API

Задача: Написать тесты для модели и эндпоинтов с помощью pytest-django.

Промт:

Напиши pytest-тесты для модели Order и для GET /api/orders/ (при условии, что используется DRF). Проверь создание заказа, фильтрацию по статусу и ограничение суммы > 0. Используй pytest-django и client. Покрыть 3 сценария: успешное создание, ошибка валидации, фильтр.

Пример:

import pytest
from django.contrib.auth.models import User
from rest_framework import status
from .models import Order

@pytest.mark.django_db
def test_order_creation():
    user = User.objects.create_user('test')
    order = Order.objects.create(customer=user, total=100.00, status='pending')
    assert order.total == 100.00

@pytest.mark.django_db
def test_order_api_list(client):
    user = User.objects.create_user('test')
    client.force_login(user)
    Order.objects.create(customer=user, total=50.00)
    resp = client.get('/api/orders/')
    assert resp.status_code == status.HTTP_200_OK
    assert len(resp.data['results']) == 1

9. Оптимизация запросов select_related / prefetch_related

Задача: Переписать ViewSet так, чтобы при GET /api/orders/ подгружались связанные объекты (customer и order items) без N+1 запросов.

Промт:

Дополни OrderViewSet: переопредели get_queryset, используй select_related('customer') и prefetch_related('items'). Дай готовый код класса.

Пример улучшения:

class OrderViewSet(viewsets.ModelViewSet):
    serializer_class = OrderSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        qs = Order.objects.select_related('customer')\
                          .prefetch_related('items__product')
        status = self.request.query_params.get('status')
        if status:
            qs = qs.filter(status=status)
        return qs

10. Кастомный permission класс для DRF

Задача: Только автор заказа может его редактировать или удалять.

Промт:

Реализуй permission класс IsOwner для Django REST Framework. Он должен проверять, что user совпадает с полем customer объекта. Если объект не найден (list action) — пропускать. Используй BasePermission.

Код:

from rest_framework.permissions import BasePermission

class IsOwner(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.customer == request.user

Подключите его в ViewSet: permission_classes = [permissions.IsAuthenticated, IsOwner].


Заключение

10 промтов, которые вы только что протестировали, охватывают 80% задач, с которыми сталкивается Django-разработчик каждый день. Используйте их как шаблон, но всегда проверяйте сгенерированный код на соответствие вашим моделям и бизнес-логике. Помните: LLM не знает вашу архитектуру, поэтому критически важно править импорты, имена и валидации. Удачной разработки — и пусть ваши тесты всегда проходят зелёными!

← Все статьи

Комментарии

Читайте также

«Комары проиграли»: как китайцы придумали умный фумигатор за 2 тысячи рублей и почему подобные гаджеты становятся новым трендом

25 июля 2026

12 промтов для отладки и поиска багов в коде

25 июля 2026

Как подключить AI-агента ASI Biont к Avito за 5 минут: автоматизация объявлений без кода

25 июля 2026

Интеграция Banana Pi с AI-агентом ASI Biont: разворачиваем локальный AI-сервер для умного дома — полное руководство с кодом и MQTT

25 июля 2026

Как подключить любой PLC к AI-агенту ASI Biont через Modbus TCP: пошаговое руководство

25 июля 2026

Claude Opus 5: новая эра vibe coding — как ИИ меняет разработку

25 июля 2026

Открыть TSV файл онлайн как в Excel: просмотр, редактирование и конвертация TSV

25 июля 2026

Он не спит, не просит отпуск и помнит всё: история самого эффективного сотрудника 2026 года

25 июля 2026

Интеграция Zigbee (ZHA, Zigbee2MQTT) с AI-агентом ASI Biont: снижаем время реакции до 80 мс и автоматизируем умный дом за 10 минут без кода

25 июля 2026