Введение
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. Это поможет вам автоматизировать интеграции и сэкономить время на реальных проектах.
Комментарии