10 промтов для Django: от моделей до REST API, которые ускорят вашу разработку

10 промтов для Django: от моделей до REST API, которые ускорят вашу разработку

Привет, коллеги! Если вы, как и я, ежедневно пишете на Django, то знаете: рутина — главный враг продуктивности. Написание однотипных моделей, сериализаторов, вьюх и админ-конфигов отнимает часы. Я собрал подборку из 10 проверенных промтов, которые реально использую в работе. Они помогут сгенерировать код быстрее, чем вы успеете налить кофе. Каждый промт — с примером и кодом. Поехали!

1. Генерация модели с валидацией и индексами

Когда использовать: Нужно быстро набросать модель с полями, валидацией и индексами, не отвлекаясь на синтаксис.

Промт:

Напиши модель Django для [название сущности, например, Product] с полями: [список полей с типами, например, name — CharField, price — DecimalField]. Добавь валидацию (например, цена не может быть отрицательной), уникальные индексы и метод __str__. Используй современный синтаксис Django 4.x.

Пример использования:

Промт:

Напиши модель Django для Product с полями: name — CharField, price — DecimalField, description — TextField, created_at — DateTimeField. Добавь валидацию, чтобы price был больше 0, уникальный индекс на name, метод __str__.

Результат (сгенерированный код):

from django.db import models
from django.core.validators import MinValueValidator
from django.utils import timezone

class Product(models.Model):
    name = models.CharField(max_length=255, unique=True, verbose_name="Название")
    price = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        validators=[MinValueValidator(0.01)],
        verbose_name="Цена"
    )
    description = models.TextField(blank=True, verbose_name="Описание")
    created_at = models.DateTimeField(default=timezone.now, verbose_name="Дата создания")

    class Meta:
        indexes = [
            models.Index(fields=['name']),
        ]
        verbose_name = "Товар"
        verbose_name_plural = "Товары"

    def __str__(self):
        return self.name

2. Сериализатор с вложенными полями

Когда использовать: Нужно быстро создать сериализатор для DRF с вложенными объектами, без ручного прописывания всех полей.

Промт:

Создай сериализатор Django REST Framework для модели [ModelName] с полями: [список полей]. Добавь вложенный сериализатор для связанной модели [RelatedModelName] с полями [список полей]. Используй ModelSerializer.

Пример использования:

Промт:

Создай сериализатор для модели Order с полями: id, created_at, total_price. Добавь вложенный сериализатор для модели OrderItem с полями: product_name, quantity, price. Используй ModelSerializer.

Результат:

from rest_framework import serializers
from .models import Order, OrderItem

class OrderItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = OrderItem
        fields = ['product_name', 'quantity', 'price']

class OrderSerializer(serializers.ModelSerializer):
    items = OrderItemSerializer(many=True, read_only=True, source='orderitem_set')

    class Meta:
        model = Order
        fields = ['id', 'created_at', 'total_price', 'items']

3. ViewSet с кастомными действиями

Когда использовать: Нужно создать ViewSet с нестандартными эндпоинтами (например, archive или restore), не отвлекаясь на шаблонный код.

Промт:

Напиши ViewSet для модели [ModelName] с методами list, create, retrieve, update, destroy. Добавь кастомное действие [action_name] по URL [url_path], которое [описание действия]. Используй ViewSet из Django REST Framework.

Пример использования:

Промт:

Напиши ViewSet для модели Task с методами list, create, retrieve, update, destroy. Добавь кастомное действие archive по URL 'archive/', которое меняет поле is_archived на True. Используй ViewSet.

Результат:

from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import Task
from .serializers import TaskSerializer

class TaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

    @action(detail=True, methods=['post'], url_path='archive')
    def archive(self, request, pk=None):
        task = self.get_object()
        task.is_archived = True
        task.save()
        return Response({'status': 'archived'}, status=status.HTTP_200_OK)

4. Кастомный админ-интерфейс с фильтрацией

Когда использовать: Нужно быстро настроить админку с фильтрами, поиском и кастомными действиями, чтобы не лазить в код каждый раз.

Промт:

Настрой админ-панель Django для модели [ModelName]. Добавь: поля для отображения [список полей], фильтры по [поля], поиск по [поля], кастомное действие [название действия], которое [описание]. Используй ModelAdmin.

Пример использования:

Промт:

Настрой админ-панель для модели Order. Добавь: поля для отображения id, created_at, total_price, is_paid; фильтры по is_paid и created_at; поиск по id; кастомное действие mark_as_paid.

Результат:

from django.contrib import admin
from .models import Order

def mark_as_paid(modeladmin, request, queryset):
    queryset.update(is_paid=True)
mark_as_paid.short_description = "Отметить как оплаченные"

class OrderAdmin(admin.ModelAdmin):
    list_display = ('id', 'created_at', 'total_price', 'is_paid')
    list_filter = ('is_paid', 'created_at')
    search_fields = ('id',)
    actions = [mark_as_paid]

admin.site.register(Order, OrderAdmin)

5. Миграция данных с помощью RunSQL

Когда использовать: Нужно написать миграцию для переноса данных из одной таблицы в другую или обновления данных.

Промт:

Напиши миграцию Django с использованием RunSQL для [описание задачи, например, перенос данных из старой таблицы в новую]. Используй сырой SQL для PostgreSQL. Добавь обратную миграцию.

Пример использования:

Промт:

Напиши миграцию Django с использованием RunSQL для переноса данных из таблицы old_product в таблицу product. Структура: old_product имеет поля name, price, new_product — name, price, is_active (по умолчанию True). Используй PostgreSQL.

Результат:

from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RunSQL(
            sql="INSERT INTO myapp_product (name, price, is_active) SELECT name, price, TRUE FROM myapp_old_product;",
            reverse_sql="DELETE FROM myapp_product;"
        ),
    ]

6. Сигналы для автоматических действий

Когда использовать: Нужно создать сигнал, который автоматически обновляет связанные данные при сохранении модели.

Промт:

Создай сигнал post_save для модели [ModelName], который при создании объекта [действие, например, создает связанную запись в другой модели]. Используй @receiver декоратор. Проверь, что сигнал вызывается только при создании, а не при обновлении.

Пример использования:

Промт:

Создай сигнал post_save для модели User, который при создании нового пользователя автоматически создает Profile с полями user и bio (пустая строка). Используй @receiver.

Результат:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import Profile

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance, bio='')

7. Кастомный менеджер с цепочками запросов

Когда использовать: Нужно добавить часто используемые фильтры в менеджер модели для удобства.

Промт:

Создай кастомный менеджер для модели [ModelName] с методами [список методов, например, active(), expensive(price)]. Каждый метод должен возвращать QuerySet. Используй современный подход с наследованием от models.Manager.

Пример использования:

Промт:

Создай кастомный менеджер для модели Product с методами: active() — фильтр по is_active=True, expensive(min_price) — фильтр по price >= min_price.

Результат:

from django.db import models

class ProductManager(models.Manager):
    def active(self):
        return self.filter(is_active=True)

    def expensive(self, min_price):
        return self.filter(price__gte=min_price)

class Product(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    is_active = models.BooleanField(default=True)

    objects = ProductManager()

8. Тесты для API эндпоинтов

Когда использовать: Нужно быстро написать тесты для REST API, чтобы проверить статус-коды и валидацию.

Промт:

Напиши тесты для эндпоинта [URL] с использованием APIClient из Django REST Framework. Проверь: GET возвращает 200, POST с валидными данными возвращает 201, POST с невалидными данными возвращает 400. Используй pytest-django или unittest.

Пример использования:

Промт:

Напиши тесты для эндпоинта /api/products/ с использованием APIClient. Проверь: GET возвращает 200, POST с name='Test' и price=100 возвращает 201, POST с price=-10 возвращает 400.

Результат:

from rest_framework.test import APITestCase
from rest_framework import status
from django.urls import reverse

class ProductAPITests(APITestCase):
    def test_get_products(self):
        url = reverse('product-list')
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_create_product_valid(self):
        url = reverse('product-list')
        data = {'name': 'Test', 'price': 100}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

    def test_create_product_invalid_price(self):
        url = reverse('product-list')
        data = {'name': 'Test', 'price': -10}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

9. Пагинация и фильтрация в API

Когда использовать: Нужно быстро добавить пагинацию и фильтрацию для эндпоинта, чтобы не писать код с нуля.

Промт:

Добавь пагинацию и фильтрацию для ViewSet [ViewSetName]. Используй PageNumberPagination и фильтрацию по [поля, например, name, price]. Подключи django-filter для кастомных фильтров.

Пример использования:

Промт:

Добавь пагинацию и фильтрацию для ProductViewSet. Используй PageNumberPagination с размером страницы 20. Фильтрация по name (поиск подстроки) и price (диапазон).

Результат:

from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters

class ProductPagination(PageNumberPagination):
    page_size = 20

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    pagination_class = ProductPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filterset_fields = ['name', 'price']
    search_fields = ['name']

10. Команда управления для очистки данных

Когда использовать: Нужно создать кастомную manage.py команду для периодической очистки или обновления данных.

Промт:

Создай кастомную команду управления Django с именем [имя команды], которая [описание задачи, например, удаляет объекты старше N дней]. Используй BaseCommand и argparse для параметров.

Пример использования:

Промт:

Создай кастомную команду управления Django с именем clean_old_orders, которая удаляет заказы старше 30 дней. Добавь параметр --days для настройки.

Результат:

from django.core.management.base import BaseCommand
from django.utils import timezone
from myapp.models import Order

class Command(BaseCommand):
    help = 'Удаляет старые заказы'

    def add_arguments(self, parser):
        parser.add_argument('--days', type=int, default=30, help='Количество дней')

    def handle(self, *args, **options):
        days = options['days']
        cutoff_date = timezone.now() - timezone.timedelta(days=days)
        deleted_count = Order.objects.filter(created_at__lt=cutoff_date).delete()[0]
        self.stdout.write(self.style.SUCCESS(f'Удалено {deleted_count} заказов'))

Заключение

Эти 10 промтов — мой личный чек-лист для ускорения разработки на Django. Они покрывают 80% рутинных задач: от создания моделей до тестов API. Сохраните эту подборку в закладки и используйте как шпаргалку. А если у вас есть свои любимые промты — делитесь в комментариях, обсудим!

← Все статьи

Комментарии

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

Интеграция Zigbee и Z-Wave с AI-агентом: как ASI Biont автоматизирует умный дом без кода

21 июля 2026

OpenAI и Hugging Face устраняют последствия инцидента безопасности при оценке моделей

21 июля 2026

Пожарная безопасность 2026: Как курсы с AI-тьютором меняют подход к обучению и защите бизнеса

21 июля 2026

ИИ для создания видео: рейтинг 11 нейросетей по качеству, промпту и доступности — июль 2026

21 июля 2026

12 промтов для создания изображений в Midjourney, DALL-E и Stable Diffusion: стили, композиция, референсы

21 июля 2026

Освойте 3D-моделирование в Blender: курс от Asibiont, который откроет путь в геймдев и анимацию

21 июля 2026

Энергия под контролем: как интеграция Energy Meters с AI-агентом ASI Biont автоматизирует учёт и снижает затраты до 35%

21 июля 2026

Стратегический консалтинг — подготовка уровня McKinsey/BCG/Bain: как попасть в элиту рынка в 2026 году

21 июля 2026

Санкции США против китайских AI-моделей: угроза за кражу интеллектуальной собственности

21 июля 2026