Введение
Разработка на Django — это постоянная работа с моделями, представлениями, сериализаторами и админкой. Даже опытные бэкенд-разработчики тратят время на шаблонный код (boilerplate). Современные языковые модели (LLM) могут сгенерировать основу за секунды, если правильно составить промт. Эта подборка — готовая шпаргалка из 10 проверенных промтов, которые помогут ускорить рутину: от описания модели до настройки REST API. Все промты предполагают, что вы используете Django 5.x и Django REST Framework 3.15+. Перед копированием кода обязательно адаптируйте имена и параметры под свой проект — AI может ошибаться в деталях (например, в типах полей или импортах).
1. Генерация модели с полями и мета-опциями
Задача: Создать модель Order с типичными полями: клиент, дата, статус, сумма. Хочется увидеть готовый код с Meta, __str__ и get_absolute_url.
Промт:
Напиши модель Django для заказа. Поля: customer (ForeignKey на User), created_at (DateTimeField, auto_now_add), status (CharField с choices: 'pending', 'paid', 'shipped', 'cancelled'), total (DecimalField, max_digits=10, decimal_places=2). Добавь class Meta с ordering = ['-created_at'], verbose_name и verbose_name_plural. Реализуй __str__ и get_absolute_url. Используй Python 3.12 и Django 5.0.
Пример использования: Скопируйте промт в ChatGPT или Claude, замените название модели и поля под свою предметную область. На выходе — готовый класс, который остаётся вставить в models.py и сделать миграцию. Итоговый код:
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
class Order(models.Model):
class Status(models.TextChoices):
PENDING = 'pending', 'Pending'
PAID = 'paid', 'Paid'
SHIPPED = 'shipped', 'Shipped'
CANCELLED = 'cancelled', 'Cancelled'
customer = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING)
total = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
ordering = ['-created_at']
verbose_name = 'Order'
verbose_name_plural = 'Orders'
def __str__(self):
return f'Order {self.id} by {self.customer}'
def get_absolute_url(self):
return reverse('order_detail', kwargs={'pk': self.pk})
2. Сериализатор DRF для модели
Задача: Быстро получить сериализатор OrderSerializer с валидацией и поддержкой вложенных объектов (например, связи customer как UserSerializer).
Промт:
Создай Django REST Framework сериализатор для модели Order (из предыдущего кода). Поле customer должно отображаться как строковое представление (read-only), а total — read-only, если статус не 'pending'. Добавь валидацию: total должен быть > 0. Используй ModelSerializer. Python 3.12, DRF 3.15.
Пример использования: Добавьте импорт модели и создайте сериализатор по аналогии. Полученный код:
from rest_framework import serializers
from .models import Order
class OrderSerializer(serializers.ModelSerializer):
customer_name = serializers.CharField(source='customer.username', read_only=True)
class Meta:
model = Order
fields = ['id', 'customer', 'customer_name', 'created_at', 'status', 'total']
read_only_fields = ['created_at', 'customer_name']
def validate_total(self, value):
if value <= 0:
raise serializers.ValidationError('Total must be positive')
if self.instance and self.instance.status != 'pending':
raise serializers.ValidationError('Cannot change total after payment')
return value
3. ViewSet для REST API (CRUD)
Задача: Полноценный ViewSet с фильтрацией, поиском и пагинацией для модели Order. Только для авторизованных пользователей.
Промт:
Напиши ModelViewSet для модели Order с permission IsAuthenticated. Реализуй фильтр по статусу (поле status) и поиск по id и customer__username. Используй DefaultPagination с размером страницы 20. Django REST Framework 3.15.
Пример получения:
from rest_framework import viewsets, filters, pagination
from .models import Order
from .serializers import OrderSerializer
class OrderPagination(pagination.PageNumberPagination):
page_size = 20
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.select_related('customer').all()
serializer_class = OrderSerializer
permission_classes = [permissions.IsAuthenticated]
pagination_class = OrderPagination
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
search_fields = ['id', 'customer__username']
ordering_fields = ['created_at', 'total']
def get_queryset(self):
qs = super().get_queryset()
status = self.request.query_params.get('status')
if status:
qs = qs.filter(status=status)
return qs
4. Кастомный менеджер модели с QuerySet
Задача: Добавить к модели Order менеджер с методом pending() и paid(), чтобы писать Order.objects.pending().
Промт:
Создай кастомный менеджер и QuerySet для модели Order. QuerySet должен содержать методы pending() и paid(), которые фильтруют по статусу. Менеджер OrderManager должен использовать этот QuerySet. Django 5.0.
Пример кода:
from django.db import models
class OrderQuerySet(models.QuerySet):
def pending(self):
return self.filter(status='pending')
def paid(self):
return self.filter(status='paid')
class OrderManager(models.Manager):
def get_queryset(self):
return OrderQuerySet(self.model, using=self._db)
def pending(self):
return self.get_queryset().pending()
def paid(self):
return self.get_queryset().paid()
# В модели: objects = OrderManager()
5. Админ-класс с кастомизацией
Задача: Настроить админку для Order: поля списка, фильтры, поиск, действия (например, пометить как оплачено).
Промт:
Создай ModelAdmin для Order в Django admin. list_display: id, customer, status, total, created_at. list_filter: status, created_at. search_fields: customer__username. Добавь action 'mark_as_paid' который меняет статус на 'paid'. Используй date_hierarchy = 'created_at'.
Пример вывода:
from django.contrib import admin
from .models import Order
def mark_as_paid(modeladmin, request, queryset):
queryset.update(status='paid')
mark_as_paid.short_description = "Mark selected orders as paid"
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ['id', 'customer', 'status', 'total', 'created_at']
list_filter = ['status', 'created_at']
search_fields = ['customer__username']
date_hierarchy = 'created_at'
actions = [mark_as_paid]
6. Сигнал post_save для уведомлений
Задача: При создании заказа отправлять email клиенту и обновлять инвентарь.
Промт:
Напиши сигнал post_save для модели Order. При создании (created=True) вызывай задачу отправки email (через Django signals) и функцию уменьшения количества товара на складе (предположим, модель Product с полем stock). Используй @receiver. Django 5.0.
Пример кода (упрощённо):
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Order
def send_order_email(order):
# логика отправки
pass
def decrease_stock(order):
for item in order.items.all():
item.product.stock -= item.quantity
item.product.save()
@receiver(post_save, sender=Order)
def order_post_save(sender, instance, created, **kwargs):
if created:
send_order_email(instance)
decrease_stock(instance)
7. Data migration для заполнения начальных данных
Задача: Перенести данные из старой таблицы или создать тестовые заказы.
Промт:
Создай пустую миграцию Django (python manage.py makemigrations --empty) и напиши в ней функцию data_migration, которая создаёт 10 тестовых заказов для пользователя с id=1. Используй Faker для генерации случайных сумм. Django 5.0, библиотека faker.
Пример миграции:
from django.db import migrations
from faker import Faker
def create_test_orders(apps, schema_editor):
Order = apps.get_model('myapp', 'Order')
User = apps.get_model('auth', 'User')
fake = Faker()
user = User.objects.get(pk=1)
for _ in range(10):
Order.objects.create(
customer=user,
total=round(fake.random_number(digits=4), 2),
status='pending'
)
class Migration(migrations.Migration):
dependencies = [('myapp', '0001_initial')]
operations = [
migrations.RunPython(create_test_orders),
]
8. Тесты для модели и API
Задача: Написать тесты для модели и эндпоинтов с помощью pytest-django.
Промт:
Напиши pytest-тесты для модели Order и для GET /api/orders/ (при условии, что используется DRF). Проверь создание заказа, фильтрацию по статусу и ограничение суммы > 0. Используй pytest-django и client. Покрыть 3 сценария: успешное создание, ошибка валидации, фильтр.
Пример:
import pytest
from django.contrib.auth.models import User
from rest_framework import status
from .models import Order
@pytest.mark.django_db
def test_order_creation():
user = User.objects.create_user('test')
order = Order.objects.create(customer=user, total=100.00, status='pending')
assert order.total == 100.00
@pytest.mark.django_db
def test_order_api_list(client):
user = User.objects.create_user('test')
client.force_login(user)
Order.objects.create(customer=user, total=50.00)
resp = client.get('/api/orders/')
assert resp.status_code == status.HTTP_200_OK
assert len(resp.data['results']) == 1
9. Оптимизация запросов select_related / prefetch_related
Задача: Переписать ViewSet так, чтобы при GET /api/orders/ подгружались связанные объекты (customer и order items) без N+1 запросов.
Промт:
Дополни OrderViewSet: переопредели get_queryset, используй select_related('customer') и prefetch_related('items'). Дай готовый код класса.
Пример улучшения:
class OrderViewSet(viewsets.ModelViewSet):
serializer_class = OrderSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
qs = Order.objects.select_related('customer')\
.prefetch_related('items__product')
status = self.request.query_params.get('status')
if status:
qs = qs.filter(status=status)
return qs
10. Кастомный permission класс для DRF
Задача: Только автор заказа может его редактировать или удалять.
Промт:
Реализуй permission класс IsOwner для Django REST Framework. Он должен проверять, что user совпадает с полем customer объекта. Если объект не найден (list action) — пропускать. Используй BasePermission.
Код:
from rest_framework.permissions import BasePermission
class IsOwner(BasePermission):
def has_object_permission(self, request, view, obj):
return obj.customer == request.user
Подключите его в ViewSet: permission_classes = [permissions.IsAuthenticated, IsOwner].
Заключение
10 промтов, которые вы только что протестировали, охватывают 80% задач, с которыми сталкивается Django-разработчик каждый день. Используйте их как шаблон, но всегда проверяйте сгенерированный код на соответствие вашим моделям и бизнес-логике. Помните: LLM не знает вашу архитектуру, поэтому критически важно править импорты, имена и валидации. Удачной разработки — и пусть ваши тесты всегда проходят зелёными!
Комментарии