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. Сохраните эту подборку в закладки и используйте как шпаргалку. А если у вас есть свои любимые промты — делитесь в комментариях, обсудим!
Комментарии