- All Django apps must live in
apps/directory. No top-level app folders. Structure:apps/{app_name}/models.py,apps/{app_name}/views.py,apps/{app_name}/serializers.py,apps/{app_name}/services.py,apps/{app_name}/tests/. - Business logic must live in
apps/{app_name}/services.py. Views import and call service functions. Never write business logic in views.py. - All database queries must live in
apps/{app_name}/models.pyas custom managers or in services.py. Never write.filter()or.get()directly in views. - Test files must be in
apps/{app_name}/tests/with naming:test_models.py,test_views.py,test_services.py,test_serializers.py. Never put tests in a singletests.pyfile. - Serializers must be in
apps/{app_name}/serializers.py. Never define serializers in views.py or models.py. - URL routing must be in
apps/{app_name}/urls.py. Never define URL patterns in views.py. - Constants and enums must be in
apps/{app_name}/constants.py. Never hardcode strings or numbers in views, serializers, or services. - All HTTP responses must use DRF Response class with explicit status codes. Never return Django HttpResponse.
- Model names must be singular:
User,BlogPost,OrderItem. NeverUsersorBlogPosts. - Serializer names must end with
Serializer:UserSerializer,BlogPostDetailSerializer,OrderItemCreateSerializer. - Service function names must be verbs:
create_user(),update_order_status(),send_notification_email(). Neveruser_creation()ororder_status_update(). - View class names must end with
VieworViewSet:UserListView,BlogPostViewSet. NeverUserAPIorBlogPostHandler. - Manager method names must be descriptive:
active_users(),recent_posts(),pending_orders(). Neverget_all()orfilter_data(). - Variable names must be explicit:
user_email,order_total,is_active. Neveru,o,x, ordata. - Boolean variables must start with
is_orhas_:is_verified,has_permission,is_deleted. Neveractiveorverifiedalone.
- Every QuerySet must have
.select_related()or.prefetch_related()if accessing foreign keys or reverse relations. Verify with Django Debug Toolbar or django-silk. Never use bare.all()or.filter()on related fields. - Every list endpoint must use pagination. Use
rest_framework.pagination.PageNumberPaginationwithpage_size=20. Never return unbounded QuerySets. - Every QuerySet must use
.only()or.defer()to limit fields fetched. Never useSELECT *implicitly. Example:User.objects.only('id', 'email', 'name'). - Raw SQL queries are forbidden. Use ORM exclusively. If ORM is insufficient, use
.raw()with parameterized queries only and document why in a comment. .count()must be called on filtered QuerySets only. Never call.count()onobjects.all()without filters.- Bulk operations must use
.bulk_create()or.bulk_update()for 10+ objects. Never loop and.save(). - All QuerySets must be evaluated in views or services, never in templates. Pass evaluated data to serializers.
- Serializers must validate all input. Use
validate_field_name()methods for field-level validation andvalidate()for cross-field validation. - Serializers must never directly call
.save()on model instances. Usecreate()andupdate()methods explicitly. - Serializers must use
read_only_fieldsfor computed or auto-generated fields:id,created_at,updated_at. - Serializers must use
required=Falseonly with explicitallow_blank=Trueorallow_null=True. Never userequired=Falsewithout justification. - Nested serializers must use
many=Truefor lists. Never return raw model instances in nested fields. - Serializers must use
sourceparameter to map model fields to API fields. Example:source='user.email'for nested access. - Serializers must define
Meta.fieldsexplicitly. Never usefields = '__all__'.
- All views must inherit from DRF classes:
APIView,ViewSet,ModelViewSet. Never use Django's genericView. - Views must use
permission_classesdecorator or class attribute. Never skip permission checks. Example:@permission_classes([IsAuthenticated]). - Views must use
authentication_classesexplicitly. Never rely on default settings. - Views must return DRF
Responsewith explicitstatuscode. Never returnJsonResponseorHttpResponse. - ViewSets must define
querysetandserializer_classas class attributes. Never define them in__init__(). - ViewSets must override
get_queryset()to apply user-specific filters. Never use class-levelquerysetfor user-dependent data. - Views must use
get_object_or_404()fromdjango.shortcuts. Never use.get()without exception handling. - Views must call service functions, never write business logic inline. Example:
user = create_user_service(validated_data).
- All service functions must accept only primitives or serializer-validated data, never raw request objects.
- Service functions must raise custom exceptions, never return error tuples or None. Define exceptions in
apps/{app_name}/exceptions.py. - Service functions must be pure or have documented side effects (email, external API calls). Add
# Side effect: sends emailcomment. - Service functions must log all state changes at INFO level. Use
logger.info(f"User {user_id} created"). - Service functions must not import views or serializers. Dependency flow: views → services → models.
- Service functions must use transactions for multi-step operations:
from django.db import transaction; @transaction.atomic.
- All exceptions must be custom classes inheriting from
ExceptionorDRF.exceptions.APIException. Define inapps/{app_name}/exceptions.py. - All service functions must raise exceptions with context:
raise UserNotFoundError(f"User {user_id} not found"). Never raise genericException. - All views must catch service exceptions and return appropriate HTTP status. Use DRF exception handlers.
- All database operations must handle
IntegrityErrorandObjectDoesNotExistexplicitly. Never let them bubble up. - All external API calls must have try/except with timeout handling. Set timeout to 5 seconds maximum.
- All form/serializer validation errors must be caught and returned as 400 with field-level error messages.
- Never use
print(). Useimport logging; logger = logging.getLogger(__name__)in every module. - Log levels:
logger.debug()for variable inspection,logger.info()for state changes,logger.warning()for recoverable issues,logger.error()for exceptions. - All service function entry/exit must be logged at DEBUG level:
logger.debug(f"create_user called with email={email}"). - All exceptions must be logged with
logger.exception()in exception handlers, neverlogger.error(). - Never log sensitive data: passwords, tokens, API keys, SSNs, credit cards. Use
***masking.
- All environment variables must be loaded via
python-decoupleordjango-environ. Never hardcode secrets. - All user input must be validated at serializer level before reaching services. Never trust request.data directly.
- All QuerySets filtering by user must use
request.user. Never accept user_id as a parameter without verification. - All file uploads must validate MIME type and size. Use
django-storagesfor S3 uploads, never local filesystem. - All API endpoints must have rate limiting. Use
django-ratelimitor DRF throttling. Set to 100 requests/hour minimum. - All SQL queries must use parameterized queries. Never use string formatting for WHERE clauses.
- All CORS headers must be explicit. Use
django-cors-headerswithCORS_ALLOWED_ORIGINSwhitelist, neverCORS_ALLOW_ALL_ORIGINS = True.
- All models must have unit tests in
apps/{app_name}/tests/test_models.py. Test custom managers and properties. - All services must have unit tests in
apps/{app_name}/tests/test_services.py. Mock external dependencies. - All views must have integration tests in
apps/{app_name}/tests/test_views.py. UseAPITestCaseandAPIClient. - All serializers must have tests in
apps/{app_name}/tests/test_serializers.py. Test validation and field mapping. - All tests must use fixtures or factories. Use
factory-boyfor model creation. Never hardcode test data. - All tests must have descriptive names:
test_create_user_with_valid_email_succeeds(). Nevertest_user()ortest_1(). - All tests must assert both success and failure cases. Never test only the happy path.
- Test coverage must be minimum 80% for services and models. Use
coverage.pyand check in CI.
- Never use
objects.all()without pagination in views. Always paginate list endpoints. - Never use
@csrf_exempt. Always use CSRF protection for POST/PUT/DELETE. - Never use
request.POSTorrequest.GETdirectly. Always use serializers for validation. - Never use
eval()orexec(). Never usepicklefor untrusted data. - Never use
datetime.now()for comparisons. Usetimezone.now()fromdjango.utils.timezone. - Never use
Model.objects.create()in views. Always use service functions. - Never use
**kwargsin function signatures without documenting expected keys. Be explicit. - Never use
from django.conf import settingsat module level. Import inside functions if needed. - Never commit database transactions manually. Use
@transaction.atomicdecorator. - Never use
get_user_model()in model definitions. Usesettings.AUTH_USER_MODELas string reference.
Source: Codelibrium — the marketplace for AI behaviour files. Browse multiple rulesets at codelibrium.com or install via CLI:
npx codelibrium-cli install <ruleset-name>