17 промтов для Django-бэкенда: модели, views, API и админка

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 объяснить код: он всегда готов помочь. Удачной разработки!

← Все статьи

Комментарии