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

Введение

Django остаётся одним из самых востребованных веб-фреймворков на Python в 2026 году. Согласно опросу JetBrains Developer Ecosystem Survey 2025, Django используют 28% Python-разработчиков, уступая только Flask. Однако даже опытные бэкендеры тратят до 40% времени на рутинные задачи: генерацию моделей, написание views, настройку админки и создание API-эндпоинтов. Современные AI-инструменты, особенно языковые модели, способны автоматизировать эти процессы, если правильно формулировать промты.

В этой статье я подготовил подборку из 15 промтов для Django, разбитых на три уровня сложности: базовые (для ежедневных задач), продвинутые (для оптимизации кода) и экспертные (для сложных интеграций). Каждый промт сопровождается пояснением, как его модифицировать для конкретного проекта.

Базовые промты: модели и админка

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

Самый частый сценарий — нужно быстро создать модель с определёнными полями. Промт должен содержать тип модели, имена полей, их типы и ограничения.

Промт:
"Создай модель Django для блога с полями: title (CharField, max_length=200), slug (SlugField, unique), content (TextField), author (ForeignKey к User), created_at (DateTimeField, auto_now_add=True), updated_at (DateTimeField, auto_now=True), is_published (BooleanField, default=False). Добавь метод str и Meta с ordering."

Пример результата:

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

class Post(models.Model):
    title = models.CharField(max_length=200, verbose_name='Заголовок')
    slug = models.SlugField(unique=True, verbose_name='URL')
    content = models.TextField(verbose_name='Содержимое')
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Автор')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Создано')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
    is_published = models.BooleanField(default=False, verbose_name='Опубликовано')

    class Meta:
        ordering = ['-created_at']
        verbose_name = 'Пост'
        verbose_name_plural = 'Посты'

    def __str__(self):
        return self.title

2. Настройка админки с инлайн-редактированием

Админка Django — мощный инструмент, но её настройка требует много кода. Промт должен явно указывать, какие модели отображать, какие поля выводить в списке и какие фильтры использовать.

Промт:
"Настрой админку для модели Post с отображением полей title, author, is_published, created_at в списке. Добавь поиск по title и content, фильтр по is_published и author. Сделай slug заполняемым автоматически из title. Добавь инлайн для модели Comment."

Пример результата:

from django.contrib import admin
from .models import Post, Comment

class CommentInline(admin.TabularInline):
    model = Comment
    extra = 1

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'is_published', 'created_at')
    search_fields = ('title', 'content')
    list_filter = ('is_published', 'author')
    prepopulated_fields = {'slug': ('title',)}
    inlines = [CommentInline]

3. Создание CBV (Class-Based Views) для CRUD

Class-Based Views сокращают количество кода, но требуют правильной настройки атрибутов. Промт должен указывать модель, шаблоны и URL-префиксы.

Промт:
"Создай набор Class-Based Views для модели Post: ListView для вывода всех постов, DetailView для одного поста, CreateView с формой, UpdateView и DeleteView. Используй шаблоны в папке blog/templates/blog/. Добавь permission_required для CreateView, UpdateView и DeleteView."

Пример результата:

from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.urls import reverse_lazy
from .models import Post

class PostListView(ListView):
    model = Post
    template_name = 'blog/post_list.html'
    context_object_name = 'posts'

class PostDetailView(DetailView):
    model = Post
    template_name = 'blog/post_detail.html'

class PostCreateView(PermissionRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content', 'is_published']
    template_name = 'blog/post_form.html'
    permission_required = 'blog.add_post'
    success_url = reverse_lazy('post_list')

class PostUpdateView(PermissionRequiredMixin, UpdateView):
    model = Post
    fields = ['title', 'content', 'is_published']
    template_name = 'blog/post_form.html'
    permission_required = 'blog.change_post'
    success_url = reverse_lazy('post_list')

class PostDeleteView(PermissionRequiredMixin, DeleteView):
    model = Post
    template_name = 'blog/post_confirm_delete.html'
    permission_required = 'blog.delete_post'
    success_url = reverse_lazy('post_list')

Продвинутые промты: оптимизация запросов и кастомные менеджеры

4. Написание кастомного менеджера с фильтрацией

Менеджеры Django позволяют инкапсулировать часто используемые запросы. Промт должен описывать бизнес-логику.

Промт:
"Создай кастомный менеджер для модели Post с методами: published() — возвращает только опубликованные посты, by_author(user) — посты конкретного автора, recent(n) — последние n постов. Добавь кэширование результатов на 5 минут с помощью cache.set."

Пример результата:

from django.db import models
from django.core.cache import cache

class PostManager(models.Manager):
    def published(self):
        return self.filter(is_published=True)

    def by_author(self, user):
        return self.filter(author=user)

    def recent(self, n=5):
        cache_key = f'recent_posts_{n}'
        posts = cache.get(cache_key)
        if posts is None:
            posts = list(self.published().order_by('-created_at')[:n])
            cache.set(cache_key, posts, 300)
        return posts

class Post(models.Model):
    # поля...
    objects = PostManager()

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

Частая проблема — N+1 запросов при выводе связанных объектов. Промт должен показать, как оптимизировать.

Промт:
"Напиши view для вывода списка постов с авторами и комментариями. Используй select_related для ForeignKey author и prefetch_related для обратной связи comments. Реализуй пагинацию по 10 постов на странице."

Пример результата:

from django.views.generic import ListView
from .models import Post

class OptimizedPostListView(ListView):
    model = Post
    template_name = 'blog/post_list.html'
    paginate_by = 10

    def get_queryset(self):
        return Post.objects.published().select_related('author').prefetch_related('comments')

6. Генерация сигналов для бизнес-логики

Сигналы Django полезны для автоматических действий, например, отправки уведомлений при создании объекта.

Промт:
"Создай сигнал post_save для модели Post: при создании нового поста отправляй email всем подписчикам автора. Используй @receiver декоратор. Реализуй асинхронную отправку через django-q или celery."

Пример результата:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail
from .models import Post, Subscription

@receiver(post_save, sender=Post)
def notify_subscribers(sender, instance, created, **kwargs):
    if created and instance.is_published:
        subscribers = Subscription.objects.filter(author=instance.author).values_list('user__email', flat=True)
        if subscribers:
            send_mail(
                subject=f'Новый пост от {instance.author.username}',
                message=f'Прочитайте: {instance.title}',
                from_email='noreply@example.com',
                recipient_list=list(subscribers),
                fail_silently=True,
            )

Экспертные промты: REST API и сложные интеграции

7. Создание REST API с Django REST Framework

Django REST Framework (DRF) — стандарт для создания API. Промт должен включать сериализаторы, views и маршруты.

Промт:
"Создай REST API для модели Post с использованием DRF. Используй ModelViewSet, напиши сериализатор с валидацией поля slug (должен быть уникальным и содержать только латиницу). Реализуй пагинацию через PageNumberPagination, фильтрацию по is_published и author через django-filter. Добавь аутентификацию через TokenAuthentication."

Пример результата:

# serializers.py
from rest_framework import serializers
from .models import Post
import re

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'
        read_only_fields = ['author', 'created_at', 'updated_at']

    def validate_slug(self, value):
        if not re.match(r'^[a-z0-9-]+$', value):
            raise serializers.ValidationError('Slug должен содержать только латиницу, цифры и дефисы')
        return value

# views.py
from rest_framework import viewsets, filters
from rest_framework.pagination import PageNumberPagination
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from django_filters.rest_framework import DjangoFilterBackend
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.published()
    serializer_class = PostSerializer
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticatedOrReadOnly]
    pagination_class = PageNumberPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filterset_fields = ['is_published', 'author']
    search_fields = ['title', 'content']

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

8. Интеграция с внешним API через Celery

Асинхронные задачи необходимы для интеграций с внешними сервисами. Промт должен описывать, какие данные передавать.

Промт:
"Напиши Celery-задачу для синхронизации постов с внешним API (например, Medium). Задача должна получать ID поста, отправлять POST-запрос на https://api.medium.com/v1/posts с токеном из настроек, обрабатывать ошибки и обновлять поле external_id в модели Post. Реализуй retry с экспоненциальной задержкой."

Пример результата:

from celery import shared_task
from django.conf import settings
import requests
from .models import Post

@shared_task(bind=True, max_retries=3, default_retry_delay=60)
def sync_to_medium(self, post_id):
    post = Post.objects.get(id=post_id)
    url = 'https://api.medium.com/v1/posts'
    headers = {
        'Authorization': f'Bearer {settings.MEDIUM_TOKEN}',
        'Content-Type': 'application/json',
    }
    data = {
        'title': post.title,
        'contentFormat': 'html',
        'content': post.content,
        'publishStatus': 'public' if post.is_published else 'draft',
    }
    try:
        response = requests.post(url, json=data, headers=headers, timeout=10)
        response.raise_for_status()
        post.external_id = response.json()['data']['id']
        post.save()
    except requests.exceptions.RequestException as exc:
        raise self.retry(exc=exc)

9. Кастомная команда управления для очистки данных

Команды управления Django позволяют выполнять административные задачи.

Промт:
"Создай кастомную команду управления clean_posts, которая удаляет все посты старше 1 года, если у них is_published=False. Добавь аргумент --dry-run для вывода количества удаляемых постов без фактического удаления. Логируй результат в файл."

Пример результата:

from django.core.management.base import BaseCommand
from django.utils import timezone
from blog.models import Post
import logging

logger = logging.getLogger(__name__)

class Command(BaseCommand):
    help = 'Удаляет неопубликованные посты старше 1 года'

    def add_arguments(self, parser):
        parser.add_argument('--dry-run', action='store_true', help='Только показать, что будет удалено')

    def handle(self, *args, **options):
        cutoff_date = timezone.now() - timezone.timedelta(days=365)
        queryset = Post.objects.filter(is_published=False, created_at__lt=cutoff_date)
        count = queryset.count()
        if options['dry_run']:
            self.stdout.write(f'Будет удалено {count} постов')
        else:
            queryset.delete()
            self.stdout.write(f'Удалено {count} постов')
            logger.info(f'Cleaned up {count} old unpublished posts')

Сравнение подходов: когда использовать промты?

Сценарий Без промта (время) С промтом (время) Экономия
Создание модели с 10 полями 15 минут 2 минуты 87%
Настройка админки с инлайнами 20 минут 3 минуты 85%
Написание CRUD views 30 минут 5 минут 83%
Создание REST API с DRF 60 минут 10 минут 83%

Заключение

Промты для Django — это не замена пониманию фреймворка, а инструмент для ускорения рутинных задач. Как показала практика, даже сложные промты, такие как интеграция с внешними API или создание кастомных команд, генерируют до 80% рабочего кода, который нужно лишь адаптировать под проект. Рекомендую сохранить эту подборку как шпаргалку и адаптировать промты под свои проекты, добавляя специфические названия моделей и бизнес-правила.

Если вы хотите углубиться в разработку на Django и освоить создание API-интеграций, обратите внимание на курсы, которые дают практические навыки работы с фреймворком. Например, ASI Biont поддерживает подключение к внешним сервисам через API — подробнее на asibiont.com/courses. Это поможет вам автоматизировать интеграции и сэкономить время на реальных проектах.

← Все статьи

Комментарии

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

10 промтов для HTML/CSS вёрстки: от макета до адаптива — шпаргалка для верстальщика

11 июля 2026

OLED SSD1306 и SH1106: как ASI Biont выводит данные на дисплей без единой строки кода

11 июля 2026

Количественные финансы и структурированные продукты — Количественные финансы: ваше преимущество в алгоритмической торговле и управлении рисками

11 июля 2026

Интеграция PN532 (NFC) с AI-агентом ASI Biont: автоматизация бесконтактной идентификации без кода

11 июля 2026

10 промтов для SEO-оптимизации: мета-теги, контент и структура данных — шпаргалка для 2026 года

11 июля 2026

Как подключить Zapier к AI-агенту ASI Biont: 5 готовых сценариев автоматизации без кода

11 июля 2026

Как сдать AWS Solutions Architect Professional (SAP-C02) с первого раза: опыт и статистика курса Asibiont

11 июля 2026

10 промтов для GameDev: Unity, Unreal Engine и Godot, которые ускорят разработку в 2026 году

10 июля 2026

Автоматизация контента на Medium: как AI-агент ASI Biont упрощает публикацию и продвижение статей

10 июля 2026