Django — мощный фреймворк, но даже опытные разработчики тратят часы на рутинные задачи: генерация моделей, настройка views, сериализаторов, админки. Я собрал 15 проверенных промтов, которые ускорят работу в разы. Они подходят для ChatGPT, Claude и других LLM. Каждый промт — готовый шаблон, который можно скопировать и адаптировать под свой проект.
1. Генерация модели по описанию
Когда использовать: нужно быстро создать модель (или несколько) на основе текстового описания бизнес-логики.
Промт:
Ты — эксперт по Django. Создай модель для [опишите сущность] с полями: [перечислите поля и типы]. Добавь Meta-класс с ordering и verbose_name. Укажи методы __str__ и get_absolute_url. Используй best practices: ForeignKey с related_name, indexes для часто фильтруемых полей.
Пример:
Создай модель для блога: Post (title, content, author, created_at, updated_at, status).
Результат:
from django.db import models
from django.urls import reverse
class Post(models.Model):
STATUS_CHOICES = [
('draft', 'Черновик'),
('published', 'Опубликован'),
]
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='posts')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
class Meta:
ordering = ['-created_at']
verbose_name = 'Пост'
verbose_name_plural = 'Посты'
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post_detail', args=[str(self.pk)])
Почему это работает: LLM обучен на огромном количестве Django-кода и знает типичные паттерны. Вы получаете готовый код без синтаксических ошибок.
2. Написание сложного QuerySet
Когда использовать: нужно сделать выборку с фильтрацией, аннотацией, агрегацией, но не хочется лезть в документацию.
Промт:
Напиши QuerySet для Django ORM, который [опишите задачу]. Используй prefetch_related/select_related для оптимизации. Объясни каждый шаг.
Пример:
Напиши QuerySet, который получает последние 10 опубликованных постов, с количеством комментариев для каждого.
Результат:
from django.db.models import Count
from .models import Post
posts = Post.objects.filter(status='published') \
.annotate(comment_count=Count('comments')) \
.select_related('author') \
.prefetch_related('comments') \
.order_by('-created_at')[:10]
Совет: Замените comments на имя вашего related_name. Если не уверены — спросите LLM.
3. Создание View (CBV) с формами
Когда использовать: нужно быстро создать представление для формы (создание/редактирование/удаление).
Промт:
Создай Django class-based view для [модель] с формой [FormName]. Включи: permission_required, success_url, template_name, context_object_name. Добавь проверку валидности и обработку ошибок.
Пример:
Создай CBV для модели Post с формой PostForm для создания нового поста.
Результат:
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Post
from .forms import PostForm
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
form_class = PostForm
template_name = 'blog/post_form.html'
success_url = reverse_lazy('post_list')
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Важно: Не забудьте импортировать LoginRequiredMixin из django.contrib.auth.mixins.
4. DRF: сериализатор с вложенными объектами
Когда использовать: нужно создать API с вложенными сериализаторами (например, автор с его постами).
Промт:
Создай Django REST Framework сериализатор для [модель] с вложенными сериализаторами для [связанная модель]. Укажи read_only_fields, extra_kwargs, метод validate.
Пример:
Создай сериализатор для модели Author, который включает все посты автора.
Результат:
from rest_framework import serializers
from .models import Author, Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'content', 'status']
class AuthorSerializer(serializers.ModelSerializer):
posts = PostSerializer(many=True, read_only=True)
class Meta:
model = Author
fields = ['id', 'name', 'email', 'posts']
Совет: Если нужно только количество постов, используйте SerializerMethodField.
5. Настройка админки: list_display, list_filter, search_fields
Когда использовать: нужно быстро настроить админку для удобной работы с данными.
Промт:
Настрой админку Django для модели [модель]. Укажи list_display, list_filter, search_fields, prepopulated_fields, list_editable, readonly_fields. Добавь методы для отображения связанных данных.
Пример:
Настрой админку для модели Post.
Результат:
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['title', 'author', 'status', 'created_at']
list_filter = ['status', 'created_at']
search_fields = ['title', 'content']
prepopulated_fields = {'slug': ('title',)}
list_editable = ['status']
readonly_fields = ['created_at', 'updated_at']
Примечание: Для prepopulated_fields нужно поле slug. Если его нет — удалите строку.
6. Миграции: генерация и применение
Когда использовать: нужно быстро сгенерировать и применить миграции после изменения моделей.
Промт:
Опиши команды для создания и применения миграций в Django. Дай инструкцию для отката миграции.
Результат:
python manage.py makemigrations
python manage.py migrate
python manage.py migrate app_name 0001_initial # откат
Совет: Если миграции не создаются, проверьте, что модель подключена в INSTALLED_APPS.
7. Фикстуры: создание и загрузка данных
Когда использовать: нужно заполнить базу тестовыми данными.
Промт:
Создай фикстуру для модели [модель] с несколькими записями. Покажи, как загрузить ее через manage.py.
Пример:
Создай фикстуру для модели Post с тремя постами.
Результат:
[
{
"model": "blog.post",
"pk": 1,
"fields": {
"title": "Первый пост",
"content": "Текст первого поста.",
"author": 1,
"status": "published"
}
}
]
Загрузить: python manage.py loaddata posts.json
8. Оптимизация запросов с select_related/prefetch_related
Когда использовать: нужно ускорить выборки, чтобы избежать N+1 запросов.
Промт:
Объясни разницу между select_related и prefetch_related. Приведи примеры, когда использовать каждый. Покажи, как проверить количество запросов.
Результат:
- select_related — для ForeignKey и OneToOne (JOIN).
- prefetch_related — для ManyToMany и reverse FK (отдельный запрос).
Проверка: from django.db import connection; print(len(connection.queries))
9. Пагинация в DRF
Когда использовать: нужно добавить пагинацию в API.
Промт:
Настрой пагинацию в Django REST Framework. Покажи пример settings.py и использование в view.
Результат:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
10. Аутентификация в DRF: JWT
Когда использовать: нужно настроить аутентификацию по JWT.
Промт:
Настрой JWT-аутентификацию в DRF с помощью библиотеки djangorestframework-simplejwt. Покажи установку, настройку и пример получения токена.
Результат:
pip install djangorestframework-simplejwt
В settings:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
В urls:
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
urlpatterns = [
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
11. Кастомные команды manage.py
Когда использовать: нужно создать свою команду для управления данными.
Промт:
Создай кастомную команду Django 'cleanup_posts', которая удаляет черновики старше 30 дней. Покажи структуру файлов и код.
Результат:
# management/commands/cleanup_posts.py
from django.core.management.base import BaseCommand
from django.utils import timezone
from datetime import timedelta
from myapp.models import Post
class Command(BaseCommand):
help = 'Удаляет черновики старше 30 дней'
def handle(self, *args, **options):
cutoff = timezone.now() - timedelta(days=30)
deleted, _ = Post.objects.filter(status='draft', created_at__lt=cutoff).delete()
self.stdout.write(f"Удалено {deleted} постов")
12. Тестирование моделей и views
Когда использовать: нужно написать тесты для проверки логики.
Промт:
Напиши тесты для Django модели [модель] и view [view]. Используй TestCase и Client.
Пример:
from django.test import TestCase
from django.urls import reverse
from .models import Post
class PostModelTest(TestCase):
def test_str_method(self):
post = Post(title='Test')
self.assertEqual(str(post), 'Test')
class PostViewTest(TestCase):
def test_post_list_uses_correct_template(self):
response = self.client.get(reverse('post_list'))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'blog/post_list.html')
13. Использование Q-объектов для сложных фильтров
Когда использовать: нужно сделать выборку с условием ИЛИ.
Промт:
Напиши QuerySet с Q-объектами для [условие]. Объясни синтаксис.
Пример:
from django.db.models import Q
posts = Post.objects.filter(Q(status='draft') | Q(author__username='admin'))
14. Генерация slug автоматически
Когда использовать: нужно автоматически создавать slug из названия.
Промт:
Добавь поле slug в модель [модель] и автоматическую генерацию из [поле]. Используй slugify и save().
Пример:
from django.utils.text import slugify
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=250, unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super().save(*args, **kwargs)
15. Отправка email через Django
Когда использовать: нужно настроить отправку писем.
Промт:
Настрой отправку email в Django через SMTP. Покажи настройки в settings.py и пример отправки.
Результат:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your@gmail.com'
EMAIL_HOST_PASSWORD = 'your_password'
Отправка:
from django.core.mail import send_mail
send_mail('Тема', 'Текст', 'from@example.com', ['to@example.com'])
Эти промты — ваш быстрый старт. Скопируйте их, адаптируйте под свой проект — и Django перестанет казаться сложным. А если застрянете — попросите LLM объяснить код: он всегда готов помочь. Удачной разработки!
Комментарии