Django — один из самых мощных и популярных бэкенд-фреймворков на Python. Он используется в Instagram, Pinterest, Disqus и многих других крупных проектах. Но даже опытные разработчики часто тратят часы на рутинные задачи: написание CRUD-операций, настройку сериализаторов, оптимизацию запросов к базе данных. А что если я скажу, что с помощью правильно сформулированных промтов для AI-ассистентов можно сократить это время в разы? В этой статье я собрал 15 проверенных промтов, которые покрывают все ключевые аспекты работы с Django: от создания моделей до построения высоконагруженных REST API. Каждый промт снабжён примером использования и пояснениями, чтобы вы могли адаптировать его под свои задачи.
Базовые промты: модели и ORM
1. Создание модели с полями и методами
Задача: Сгенерировать модель Django с нужными полями, валидацией и методами.
Промт:
Создай модель Django для интернет-магазина. Включи поля: название товара (CharField), цена (DecimalField), количество на складе (IntegerField), дата добавления (DateTimeField с auto_now_add). Добавь метод для вычисления общей стоимости товара на складе и Meta-класс с сортировкой по цене.
Пример результата:
from django.db import models
from django.core.validators import MinValueValidator
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(0)])
stock = models.IntegerField(default=0, validators=[MinValueValidator(0)])
created_at = models.DateTimeField(auto_now_add=True)
def total_value(self):
return self.price * self.stock
class Meta:
ordering = ['price']
Пояснение: Такой промт экономит время на рутинном написании кода. Вы можете уточнять типы полей, добавлять внешние ключи, unique-ограничения и т.д.
2. Генерация QuerySet с фильтрацией и аннотацией
Задача: Написать запрос к БД с фильтрацией, агрегацией и аннотацией.
Промт:
Напиши Django ORM-запрос, который возвращает топ-10 товаров по сумме продаж (используй аннотацию Sum, сортировку и limit). Модели: Order (заказ) и OrderItem (позиция заказа) с FK на Product.
Пример результата:
from django.db.models import Sum, F
# Предполагаем, что OrderItem имеет поле quantity и product FK
top_products = Product.objects.annotate(
total_sold=Sum('orderitem__quantity')
).order_by('-total_sold')[:10]
Пояснение: Промт позволяет быстро получить сложный ORM-запрос без долгих поисков в документации. Главное — чётко описать структуру моделей.
3. Миграции и управление схемой БД
Задача: Сгенерировать команды для создания и применения миграций, а также для отката изменений.
Промт:
Опиши процесс создания миграций для нового поля в модели Django, включая команды makemigrations, migrate и sqlmigrate для проверки SQL.
Пример результата:
python manage.py makemigrations
python manage.py migrate
python manage.py sqlmigrate myapp 0001
Пояснение: Такой промт полезен новичкам, которые только знакомятся с миграциями. Он объясняет последовательность действий и назначение каждой команды.
Продвинутые промты: views, API и админка
4. Функциональные и классовые представления
Задача: Создать view для отображения списка товаров с пагинацией и поиском.
Промт:
Напиши Django class-based view для списка товаров с пагинацией (по 20 на страницу) и поиском по названию. Используй ListView и переопредели get_queryset.
Пример результата:
from django.views.generic import ListView
from .models import Product
class ProductListView(ListView):
model = Product
template_name = 'products/list.html'
paginate_by = 20
def get_queryset(self):
queryset = super().get_queryset()
query = self.request.GET.get('q')
if query:
queryset = queryset.filter(name__icontains=query)
return queryset
Пояснение: Классовые представления — стандарт в Django. Промт помогает быстро генерировать их с нужной логикой.
5. Сериализаторы и вьюсеты DRF
Задача: Создать REST API для модели с помощью Django REST Framework.
Промт:
Создай сериализатор и ModelViewSet для модели Product. Добавь фильтрацию по цене и поиск по названию. Используй DjangoFilterBackend и SearchFilter.
Пример результата:
from rest_framework import serializers, viewsets
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ['id', 'name', 'price', 'stock']
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend, SearchFilter]
filterset_fields = ['price']
search_fields = ['name']
Пояснение: DRF — стандарт для создания API в Django. Промт генерирует минимальный рабочий код, который можно расширять.
6. Кастомные действия в ViewSet
Задача: Добавить кастомное действие для изменения цены товара.
Промт:
Добавь в ProductViewSet кастомное действие @action, которое позволяет изменить цену товара (POST запрос с полем new_price).
Пример результата:
from rest_framework.decorators import action
from rest_framework.response import Response
class ProductViewSet(viewsets.ModelViewSet):
# ... остальной код
@action(detail=True, methods=['post'])
def change_price(self, request, pk=None):
product = self.get_object()
new_price = request.data.get('new_price')
if new_price is not None:
product.price = new_price
product.save()
return Response({'status': 'ok'})
return Response({'error': 'new_price required'}, status=400)
Пояснение: Кастомные действия — мощная возможность DRF. Промт помогает быстро добавить нестандартные операции.
7. Настройка админки: list_display и actions
Задача: Расширить админку для модели Product: вывести нужные поля, добавить фильтры и кастомное действие.
Промт:
Создай класс ProductAdmin для модели Product. Выведи в list_display поля name, price, stock, created_at. Добавь фильтры по цене и дате, поиск по названию. Добавь action для установки скидки 10% на выбранные товары.
Пример результата:
from django.contrib import admin
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ['name', 'price', 'stock', 'created_at']
list_filter = ['price', 'created_at']
search_fields = ['name']
actions = ['apply_discount_10']
@admin.action(description='Применить скидку 10%')
def apply_discount_10(self, request, queryset):
for product in queryset:
product.price = product.price * 0.9
product.save()
Пояснение: Админка Django — мощный инструмент, и промт позволяет быстро настроить её под свои нужды.
8. Оптимизация запросов: select_related и prefetch_related
Задача: Оптимизировать запросы с отношениями ManyToOne и ManyToMany.
Промт:
Объясни, как использовать select_related и prefetch_related для уменьшения количества запросов к БД. Приведи пример для модели Order с FK на User и M2M на Product.
Пример результата:
# Вместо N+1 запросов
orders = Order.objects.select_related('user').prefetch_related('products')
Пояснение: Оптимизация запросов критична для производительности. Промт помогает понять, как избежать проблемы N+1.
Экспертные промты: сложные сценарии
9. Кастомные менеджеры и QuerySet
Задача: Создать менеджер с методами, специфичными для предметной области.
Промт:
Создай менеджер для модели Product, который добавляет метод available() для товаров со stock > 0, и метод cheap(max_price=100), который фильтрует по цене ниже указанной.
Пример результата:
from django.db import models
class ProductQuerySet(models.QuerySet):
def available(self):
return self.filter(stock__gt=0)
def cheap(self, max_price=100):
return self.filter(price__lt=max_price)
class Product(models.Model):
# ... поля
objects = ProductQuerySet.as_manager()
Пояснение: Кастомные менеджеры позволяют инкапсулировать часто используемые запросы.
10. Сигналы для бизнес-логики
Задача: Создать сигнал, который автоматически обновляет остаток на складе при создании заказа.
Промт:
Напиши сигнал post_save для модели OrderItem, который уменьшает количество товара на складе при создании позиции заказа.
Пример результата:
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import OrderItem, Product
@receiver(post_save, sender=OrderItem)
def update_stock(sender, instance, created, **kwargs):
if created:
product = instance.product
product.stock -= instance.quantity
product.save()
Пояснение: Сигналы — мощный инструмент для реализации бизнес-правил, но использовать их нужно осторожно, чтобы не создавать циклических зависимостей.
11. Кастомные валидаторы и поля форм
Задача: Написать валидатор для поля, который проверяет уникальность email с доменом.
Промт:
Создай валидатор для Django, который проверяет, что email принадлежит домену @example.com. Используй его в модели и форме.
Пример результата:
from django.core.exceptions import ValidationError
def validate_example_email(value):
if not value.endswith('@example.com'):
raise ValidationError('Email должен быть на домене example.com')
# В модели:
email = models.EmailField(validators=[validate_example_email])
Пояснение: Валидаторы — ключевой элемент контроля данных. Промт помогает реализовать специфические правила.
12. Работа с транзакциями и блокировками
Задача: Обеспечить атомарность операции по списанию средств.
Промт:
Напиши функцию, которая переводит деньги с одного счёта на другой, используя transaction.atomic и select_for_update для избежания гонок.
Пример результата:
from django.db import transaction
from .models import Account
def transfer(sender_id, receiver_id, amount):
with transaction.atomic():
sender = Account.objects.select_for_update().get(id=sender_id)
receiver = Account.objects.select_for_update().get(id=receiver_id)
if sender.balance < amount:
raise ValueError('Недостаточно средств')
sender.balance -= amount
receiver.balance += amount
sender.save()
receiver.save()
Пояснение: Транзакции и блокировки критичны для целостности данных. Промт демонстрирует правильный паттерн.
13. Тестирование с помощью pytest-django
Задача: Написать тесты для API-эндпоинтов с использованием pytest и DRF.
Промт:
Напиши тесты для ProductViewSet, используя pytest-django и APIClient. Проверь получение списка товаров и создание нового товара.
Пример результата:
import pytest
from rest_framework.test import APIClient
from .models import Product
@pytest.mark.django_db
def test_get_products():
client = APIClient()
response = client.get('/api/products/')
assert response.status_code == 200
@pytest.mark.django_db
def test_create_product():
client = APIClient()
data = {'name': 'Тестовый товар', 'price': 100, 'stock': 5}
response = client.post('/api/products/', data, format='json')
assert response.status_code == 201
Пояснение: Автотесты — неотъемлемая часть разработки. Промт генерирует базовые тесты для API.
14. Кэширование для повышения производительности
Задача: Объяснить, как использовать кэш в Django для снижения нагрузки на БД.
Промт:
Покажи пример кэширования результата сложного запроса с использованием cache.set и cache.get, а также как использовать cache_page для view.
Пример результата:
from django.core.cache import cache
from .models import Product
def get_top_products():
key = 'top_products'
products = cache.get(key)
if not products:
products = list(Product.objects.annotate(...).order_by('-total_sold')[:10])
cache.set(key, products, 300) # 5 минут
return products
# Для view:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def top_products_view(request):
# ...
Пояснение: Кэширование — ключевой инструмент для масштабирования. Промт показывает простые и эффективные методы.
15. Кастомные команды управления
Задача: Создать management command для очистки устаревших записей.
Промт:
Создай кастомную команду Django для удаления товаров, у которых stock = 0 и цена меньше 100. Команда должна принимать аргумент --dry-run для вывода без удаления.
Пример результата:
from django.core.management.base import BaseCommand
from .models import Product
class Command(BaseCommand):
help = 'Удаляет товары с нулевым остатком и ценой ниже 100'
def add_arguments(self, parser):
parser.add_argument('--dry-run', action='store_true', help='Только показать, что будет удалено')
def handle(self, *args, **options):
products = Product.objects.filter(stock=0, price__lt=100)
if options['dry_run']:
self.stdout.write(self.style.WARNING(f'Будет удалено: {products.count()} товаров'))
else:
products.delete()
self.stdout.write(self.style.SUCCESS('Удалено'))
Пояснение: Кастомные команды автоматизируют рутинные операции и легко тестируются.
Заключение
Эти 15 промтов — лишь малая часть того, что можно сделать с помощью AI-ассистентов при работе с Django. Главное — научиться правильно формулировать задачи: указывать структуру моделей, желаемые методы, параметры. Тогда вы сможете генерировать не просто шаблонный код, а решения, точно соответствующие вашим требованиям. Начните с простых примеров, постепенно усложняя запросы. И не забывайте проверять сгенерированный код — даже самый умный ассистент может ошибаться. Удачной разработки!
Комментарии