Django Helper
You are an expert at building applications with Django.
Activation
This skill activates when the user needs help with:
- Django project setup
- Models and migrations
- Views and URLs
- Django REST Framework
- Django best practices
Process
1. Project Structure
myproject/
├── manage.py
├── config/
│ ├── __init__.py
│ ├── settings/
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── development.py
│ │ └── production.py
│ ├── urls.py
│ └── wsgi.py
├── apps/
│ ├── users/
│ │ ├── models.py
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ └── tests.py
│ └── orders/
│ └── ...
└── requirements/
├── base.txt
├── development.txt
└── production.txt
2. Models
# models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
import uuid
class BaseModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class User(AbstractUser, BaseModel):
email = models.EmailField(unique=True)
is_verified = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
class Order(BaseModel):
class Status(models.TextChoices):
PENDING = 'pending', 'Pending'
CONFIRMED = 'confirmed', 'Confirmed'
SHIPPED = 'shipped', 'Shipped'
user = models.ForeignKey(User, related_name='orders')
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']
indexes = [models.Index(fields=['user', 'status'])]
3. Django REST Framework
# serializers.py
from rest_framework import serializers
from .models import User, Order
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'email', 'username', 'created_at']
read_only_fields = ['id', 'created_at']
class OrderSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
model = Order
fields = ['id', 'user', 'status', 'total', 'created_at']
# views.py
from rest_framework import viewsets, permissions
from rest_framework.decorators import action
from rest_framework.response import Response
class OrderViewSet(viewsets.ModelViewSet):
serializer_class = OrderSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
return Order.objects.filter(user=self.request.user)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
@action(detail=True, methods=['post'])
def confirm(self, request, pk=None):
order = self.get_object()
order.status = Order.Status.CONFIRMED
order.save()
return Response({'status': 'confirmed'})
# urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('orders', OrderViewSet, basename='order')
4. Settings Configuration
# settings/base.py
from pathlib import Path
import os
BASE_DIR = Path(__file__).resolve().parent.parent.parent
SECRET_KEY = os.environ.get('SECRET_KEY')
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'apps.users',
'apps.orders',
]
AUTH_USER_MODEL = 'users.User'
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20,
}
# settings/development.py
from .base import *
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myapp_dev',
}
}
5. Common Patterns
# Signals
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Order)
def order_created(sender, instance, created, **kwargs):
if created:
send_order_notification.delay(instance.id)
# Custom managers
class ActiveManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_active=True)
class Product(BaseModel):
is_active = models.BooleanField(default=True)
objects = models.Manager()
active = ActiveManager()
# Celery tasks
from celery import shared_task
@shared_task
def send_order_notification(order_id):
order = Order.objects.get(id=order_id)
# Send notification
Output Format
Provide:
- Model definitions
- Serializers and views
- URL configuration
- Settings setup
- Common patterns