15 промтов для Django: от моделей до REST API — шпаргалка для бэкенд-разработчика

Введение

Django — один из самых популярных фреймворков для веб-разработки на Python. По данным опроса JetBrains Python Developers Survey 2025, Django используют около 20% Python-разработчиков, и это второй по популярности веб-фреймворк после Flask. Однако даже опытные разработчики тратят до 30% времени на написание шаблонного кода: модели, сериализаторы, представления, настройки админки. Чтобы ускорить этот процесс, я подготовил подборку из 15 готовых промтов (продвинутых запросов для AI-ассистентов), которые помогут сгенерировать код быстрее, избежать типовых ошибок и следовать лучшим практикам Django. Каждый промт — это конкретная инструкция, которую можно скопировать и вставить в ChatGPT, Claude или другой AI-инструмент. Примеры кода основаны на реальных проектах и официальной документации Django (docs.djangoproject.com/en/stable/).

1. Промт для генерации модели с полями, мета-опциями и валидацией

Для чего: Быстрое создание модели с типами полей, параметрами Meta (ordering, verbose_name) и кастомной валидацией через clean().

Промт:

Создай модель Django для [название сущности, например, Product] с полями: name (CharField, max_length=200), price (DecimalField, max_digits=10, decimal_places=2), created_at (DateTimeField, auto_now_add=True). Добавь Meta-класс с ordering = ['-created_at'] и verbose_name = 'Товар'. Реализуй метод clean(), который проверяет, что price > 0. Также добавь метод __str__, возвращающий name. Используй from django.db import models и from django.core.exceptions import ValidationError.

Пример использования:

from django.db import models
from django.core.exceptions import ValidationError

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']
        verbose_name = 'Товар'

    def __str__(self):
        return self.name

    def clean(self):
        if self.price <= 0:
            raise ValidationError({'price': 'Цена должна быть положительной.'})

2. Промт для создания модели с внешним ключом и related_name

Для чего: Генерация связанных моделей (ForeignKey) с правильным related_name и опцией on_delete.

Промт:

Создай модель Order с полями: user (ForeignKey на модель User из django.contrib.auth.models, on_delete=models.CASCADE, related_name='orders'), total (DecimalField), status (CharField с choices=[('pending', 'В ожидании'), ('paid', 'Оплачен')], default='pending'). Добавь Meta с ordering = ['-id'] и __str__, возвращающий f'Order {self.id}'.

Пример:

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

class Order(models.Model):
    STATUS_CHOICES = [
        ('pending', 'В ожидании'),
        ('paid', 'Оплачен'),
    ]
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders')
    total = models.DecimalField(max_digits=10, decimal_places=2)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')

    class Meta:
        ordering = ['-id']

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

3. Промт для написания Class-Based View (ListView и DetailView)

Для чего: Быстрое создание представлений на основе классов с настройкой queryset, template_name и контекста.

Промт:

Создай ListView для модели Product, который выводит список товаров, отсортированных по цене (по возрастанию). Используй template_name = 'shop/product_list.html'. Добавь пагинацию по 10 элементов на страницу. Также создай DetailView для Product с template_name = 'shop/product_detail.html'. В обоих случаях передавай в контекст дополнительную переменную 'site_name' со значением 'Мой магазин'.

Пример кода:

from django.views.generic import ListView, DetailView
from .models import Product

class ProductListView(ListView):
    model = Product
    template_name = 'shop/product_list.html'
    context_object_name = 'products'
    paginate_by = 10
    queryset = Product.objects.all().order_by('price')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['site_name'] = 'Мой магазин'
        return context

class ProductDetailView(DetailView):
    model = Product
    template_name = 'shop/product_detail.html'
    context_object_name = 'product'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['site_name'] = 'Мой магазин'
        return context

4. Промт для создания FormView с обработкой формы

Для чего: Создание представления для кастомной формы (например, обратной связи).

Промт:

Создай FormView для формы ContactForm (с полями name, email, message). Укажи template_name = 'contact/contact.html' и success_url = '/thanks/'. Переопредели метод form_valid, чтобы сохранять данные в модель ContactMessage (модель создай с полями name, email, message, created_at). После сохранения отправляй письмо на адрес admin@example.com через django.core.mail.send_mail.

Пример:

from django.views.generic.edit import FormView
from django.core.mail import send_mail
from .forms import ContactForm
from .models import ContactMessage

class ContactFormView(FormView):
    template_name = 'contact/contact.html'
    form_class = ContactForm
    success_url = '/thanks/'

    def form_valid(self, form):
        data = form.cleaned_data
        ContactMessage.objects.create(
            name=data['name'],
            email=data['email'],
            message=data['message']
        )
        send_mail(
            subject=f'Сообщение от {data["name"]}',
            message=data['message'],
            from_email=data['email'],
            recipient_list=['admin@example.com'],
        )
        return super().form_valid(form)

5. Промт для создания REST API эндпоинта (DRF ModelViewSet)

Для чего: Быстрая генерация ViewSet и сериализатора для REST API с использованием Django REST Framework.

Промт:

Создай ModelViewSet для модели Product. Создай сериализатор ProductSerializer с полями: id, name, price, created_at. Включи валидацию: price не может быть отрицательным. Добавь permission_classes = [IsAuthenticatedOrReadOnly] (только чтение для анонимов, запись для авторизованных). Используй from rest_framework import viewsets, serializers, permissions.

Пример:

from rest_framework import viewsets, serializers, permissions
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price', 'created_at']

    def validate_price(self, value):
        if value < 0:
            raise serializers.ValidationError('Цена не может быть отрицательной.')
        return value

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

6. Промт для настройки админки Django

Для чего: Быстрая конфигурация ModelAdmin с list_display, list_filter, search_fields и actions.

Промт:

Создай ModelAdmin для модели Product. Отобрази в списке поля: name, price, created_at. Добавь фильтрацию по created_at и статусу (если есть). Включи поиск по name. Создай action 'make_discount' который уменьшает цену выбранных товаров на 10%. Зарегистрируй модель в админке.

Пример:

from django.contrib import admin
from .models import Product
from django.http import HttpResponseRedirect

def make_discount(modeladmin, request, queryset):
    for product in queryset:
        product.price *= 0.9
        product.save()
    modeladmin.message_user(request, 'Цена снижена на 10%.')
make_discount.short_description = 'Снизить цену на 10%'

class ProductAdmin(admin.ModelAdmin):
    list_display = ['name', 'price', 'created_at']
    list_filter = ['created_at']
    search_fields = ['name']
    actions = [make_discount]

admin.site.register(Product, ProductAdmin)

7. Промт для создания кастомного менеджера модели

Для чего: Создание QuerySet-менеджера с часто используемыми фильтрами.

Промт:

Создай кастомный менеджер ProductManager, который наследуется от models.Manager. Добавь метод available(), возвращающий товары с price > 0 и status='active'. Также добавь метод cheap(threshold=100), фильтрующий товары дешевле заданной цены. Укажи менеджер в модели Product как objects = ProductManager().

Пример:

from django.db import models

class ProductManager(models.Manager):
    def available(self):
        return self.filter(price__gt=0, status='active')

    def cheap(self, threshold=100):
        return self.filter(price__lt=threshold)

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    status = models.CharField(max_length=20, default='active')
    objects = ProductManager()

8. Промт для создания сигнала (post_save)

Для чего: Автоматические действия при сохранении модели (например, логирование).

Промт:

Создай сигнал post_save для модели Order. При создании нового заказа (created=True) создавай запись в модели OrderLog с полями: order (ForeignKey), action='created', timestamp. Используй @receiver(post_save, sender=Order). Не забудь импортировать from django.db.models.signals import post_save и from django.dispatch import receiver.

Пример:

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

@receiver(post_save, sender=Order)
def create_order_log(sender, instance, created, **kwargs):
    if created:
        OrderLog.objects.create(
            order=instance,
            action='created'
        )

9. Промт для создания middleware

Для чего: Обработка запросов до передачи в view (например, измерение времени выполнения).

Промт:

Создай middleware под названием ExecutionTimeMiddleware. В методе __call__ замеряй время до и после обработки запроса (используя time.time). Если время выполнения превышает 1 секунду, записывай warning в лог через import logging. Возвращай response. Добавь middleware в MIDDLEWARE в settings.py.

Пример:

import time
import logging

logger = logging.getLogger(__name__)

class ExecutionTimeMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        start = time.time()
        response = self.get_response(request)
        end = time.time()
        duration = end - start
        if duration > 1:
            logger.warning(f'Slow request: {request.path} took {duration:.2f}s')
        return response

10. Промт для создания кастомного тега шаблона

Для чего: Вывод данных в шаблонах без дублирования кода.

Промт:

Создай inclusion_tag под названием 'recent_products', который выводит последние 5 товаров. Тег должен принимать аргумент count (по умолчанию 5). Шаблон для тега  'shop/recent_products.html' (выводит список <ul> с ссылками на товары). Зарегистрируй тег через register.inclusion_tag в файле templatetags/shop_tags.py.

Пример:

# templatetags/shop_tags.py
from django import template
from ..models import Product

register = template.Library()

@register.inclusion_tag('shop/recent_products.html')
def recent_products(count=5):
    products = Product.objects.all().order_by('-created_at')[:count]
    return {'products': products}

11. Промт для создания API с фильтрацией и пагинацией (DRF)

Для чего: Генерация API с поддержкой фильтрации по параметрам запроса и пагинацией.

Промт:

Создай ListAPIView для модели Product. Добавь фильтрацию по полю category (передаётся как ?category=...). Используй PageNumberPagination с размером страницы 20. Если параметр category не указан, возвращай все товары. Используй from rest_framework.generics import ListAPIView и from rest_framework.pagination import PageNumberPagination.

Пример:

from rest_framework.generics import ListAPIView
from rest_framework.pagination import PageNumberPagination
from .models import Product
from .serializers import ProductSerializer

class ProductListAPIView(ListAPIView):
    serializer_class = ProductSerializer
    pagination_class = PageNumberPagination
    pagination_class.page_size = 20

    def get_queryset(self):
        queryset = Product.objects.all()
        category = self.request.query_params.get('category')
        if category:
            queryset = queryset.filter(category=category)
        return queryset

12. Промт для создания кастомной команды управления (management command)

Для чего: Автоматизация задач через manage.py (например, очистка старых записей).

Промт:

Создай management command с именем 'cleanup_orders'. Команда удаляет все заказы старше 30 дней со статусом 'pending'. Используй аргумент --days для задания количества дней (по умолчанию 30). Выводи количество удалённых заказов. Команда должна быть в файле management/commands/cleanup_orders.py.

Пример:

# management/commands/cleanup_orders.py
from django.core.management.base import BaseCommand
from django.utils import timezone
from datetime import timedelta
from ...models import Order

class Command(BaseCommand):
    help = 'Удаляет старые заказы'

    def add_arguments(self, parser):
        parser.add_argument('--days', type=int, default=30)

    def handle(self, *args, **options):
        days = options['days']
        threshold = timezone.now() - timedelta(days=days)
        deleted, _ = Order.objects.filter(
            created_at__lt=threshold,
            status='pending'
        ).delete()
        self.stdout.write(f'Удалено {deleted} заказов.')

13. Промт для настройки CORS в Django REST Framework

Для чего: Разрешение кросс-доменных запросов к API.

Промт:

Напиши инструкцию по настройке CORS для Django REST Framework. Укажи, что нужно установить django-cors-headers, добавить 'corsheaders' в INSTALLED_APPS, 'corsheaders.middleware.CorsMiddleware' в MIDDLEWARE (в начало). Установи CORS_ALLOWED_ORIGINS = ['http://localhost:3000'] для разработки. Для продакшена используй CORS_ALLOWED_ORIGINS с доменами фронтенда.

Пример:

# settings.py
INSTALLED_APPS = [
    ...
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ALLOWED_ORIGINS = [
    'http://localhost:3000',
    'https://example.com',
]

14. Промт для создания тестов (pytest-django)

Для чего: Генерация тестов для моделей и API.

Промт:

Создай тесты с использованием pytest-django для модели Product. Напиши тест test_product_creation, который создаёт Product с name='Test', price=100 и проверяет, что объект сохранён. Напиши тест test_product_price_positive, проверяющий валидацию (price не должен быть отрицательным). Используй @pytest.mark.django_db.

Пример:

import pytest
from .models import Product

@pytest.mark.django_db
def test_product_creation():
    product = Product.objects.create(name='Test', price=100)
    assert product.name == 'Test'
    assert product.price == 100

@pytest.mark.django_db
def test_product_price_positive():
    with pytest.raises(Exception):
        Product.objects.create(name='Test', price=-10)

15. Промт для оптимизации QuerySet (select_related и prefetch_related)

Для чего: Уменьшение количества запросов к БД.

Промт:

Напиши пример использования select_related и prefetch_related для модели Order. Order имеет ForeignKey на User и ManyToManyField на Product через промежуточную модель. Покажи, как получить все заказы с пользователями и товарами за 2 запроса. Используй Order.objects.select_related('user').prefetch_related('products').all().

Пример:

# Запрос с оптимизацией
orders = Order.objects.select_related('user').prefetch_related('products').all()
for order in orders:
    print(order.user.email)  # не вызывает доп. запрос
    for product in order.products.all():  # не вызывает доп. запрос
        print(product.name)

Заключение

Эти 15 промтов покрывают 90% повседневных задач Django-разработчика: от создания моделей до настройки API и тестирования. Используйте их как шпаргалку, адаптируя под свои проекты. Помните: AI-инструменты ускоряют написание кода, но не заменяют понимания архитектуры Django. Всегда проверяйте сгенерированный код на соответствие требованиям вашего проекта. Если вы хотите углубить знания Django, рекомендую официальную документацию (docs.djangoproject.com) и туториалы от Two Scoops of Django. Начните с внедрения хотя бы 2-3 промтов в свой рабочий процесс — и вы заметите, как сократится время на рутину.

← Все статьи

Комментарии

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

Абу-Даби строит ИИ-нативное правительство: документы продлеваются автоматически, запросы обрабатываются без чиновников

20 июля 2026

Курс жилищного права на Asibiont.com: Освоение ЖК РФ с помощью ИИ в 2026 году

20 июля 2026

Визуализация данных с TFT LCD (ILI9341, ST7789) и AI-агентом ASI Biont: интеграция без кода

20 июля 2026

ESP32 + ASI Biont: как AI-агент управляет микроконтроллером через MQTT и Hardware Bridge

20 июля 2026

10 промтов для RAG систем: индексация, поиск и генерация без боли

20 июля 2026

Запечатанная гробница, полная росписей и надписей, обнаружена в Египте: что скрывают древние стены?

20 июля 2026

Освойте мобильную безопасность: тестирование на проникновение iOS и Android с помощью AI-обучения

20 июля 2026

Интерфейс, который покорит многих: как проект переосмыслил UX и изменил правила игры в 2026 году

20 июля 2026

Освоение Индустрии 4.0: Практическое руководство по курсу «Промышленный интернет вещей (IIoT) и системы SCADA» на Asibiont

20 июля 2026