15 промтов для Django: от моделей до REST API — прокачай бэкенд

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. Главное — научиться правильно формулировать задачи: указывать структуру моделей, желаемые методы, параметры. Тогда вы сможете генерировать не просто шаблонный код, а решения, точно соответствующие вашим требованиям. Начните с простых примеров, постепенно усложняя запросы. И не забывайте проверять сгенерированный код — даже самый умный ассистент может ошибаться. Удачной разработки!

← Все статьи

Комментарии

Читайте также

Овладение невидимым: глубокое погружение в курс ELAT для поступления в Кембридж на Asibiont

17 августа 2026

Регулирование ИИ: как новая инициатива Dario Amodei меняет правила игры

17 августа 2026

HC-SR04 и ASI Biont: как подключить ультразвуковой датчик к AI-агенту и автоматизировать мониторинг

17 августа 2026

Интеграция OPC-UA (SCADA, DCS) с AI-агентом ASI Biont: практическое руководство по подключению и автоматизации

17 августа 2026

LFM2.5-VL-3B: новый стандарт быстрого и точного компьютерного зрения на периферии

17 августа 2026

Первый промпт с GitHub Copilot: как правильно написать и получить максимум пользы

17 августа 2026

Сравниваем LLM: 12 тестов для китайских флагманов Kimi K3, GLM-5.2, DeepSeek V4 Pro и Qwen 3.8 Max

17 августа 2026

15 промтов для Django: от моделей до REST API — бэкенд-разработка с нейросетями

17 августа 2026

TypeScript в 2026 году: почему каждому JavaScript-разработчику нужна статическая типизация (обзор курса)

17 августа 2026