.cursorrules (deprecated)
rules/python-django/.cursorrules.cursorrules
Quality
99/100
Scores the file, not the repository.Length
1,035 words
13 headings · 1 code blocksRepository
16
— · pushed 109 days agoLast changed
2 days ago
First indexed 2 days ago.1# Python Django 5+ with DRF — Cursor Rules23You are an expert Python developer building web applications with Django 5+ and Django REST Framework, following Django best practices.45## Code Style67- Use Python 3.11+ features where appropriate: type hints, `match` statements, `StrEnum`.8- Type-annotate function signatures for public functions and methods. Use `django-stubs` for Django type support.9- Use `snake_case` for functions, variables, and modules. `PascalCase` for classes. `UPPER_SNAKE_CASE` for settings.10- Follow Django naming conventions: models are singular (`User`, `Article`), apps are plural or descriptive (`users`, `articles`).11- Line length: 88 characters (Black default). Use Black for formatting, Ruff for linting.12- Import order: stdlib, Django, third-party, local. Use `isort` with Django profile.13- Prefer f-strings for string formatting.14- Write docstrings for all models, views, and serializers explaining their purpose.1516## Django Project Structure1718- One app per domain concept. Keep apps focused and loosely coupled.19- Use `apps.py` to configure app metadata and signal connections.20- Place URL patterns in each app's `urls.py`, include them in the root `urls.py` with a namespace.21- Use `settings/` package for environment-specific configs: `base.py`, `development.py`, `production.py`, `testing.py`.22- Store reusable utilities in a `core` or `common` app.2324## Models2526- Every model gets a docstring explaining its purpose and relationships.27- Use explicit `related_name` on all ForeignKey and ManyToManyField relationships.28- Define `__str__` on every model — it must return a meaningful human-readable string.29- Use `Meta` class for ordering, constraints, indexes, verbose names, and permissions.30- Prefer `UUIDField` for public-facing primary keys. Keep auto-incrementing `id` for internal use.31- Use `TimeStampedModel` base class with `created_at` and `updated_at` fields for all models.32- Use Django's built-in field types. Prefer `CharField` with `max_length` over `TextField` when length is bounded.33- Define choices as `TextChoices` or `IntegerChoices` enums on the model class.34- Add database indexes on fields used in frequent queries: `db_index=True` or `Meta.indexes`.35- Use `constraints` in Meta for database-level validation (UniqueConstraint, CheckConstraint).3637## Views and Serializers (DRF)3839- Prefer `ModelViewSet` for full CRUD. Use `GenericAPIView` + mixins for partial CRUD.40- Use `ModelSerializer` for standard serialization. Use `Serializer` for custom input/output shapes.41- Define `read_only_fields` in serializer Meta. Never allow users to set `id`, `created_at`, `updated_at`.42- Use separate serializers for create, update, list, and detail when field sets differ.43- Override `get_queryset()` to scope queries to the current user or permissions.44- Use `select_related` and `prefetch_related` in `get_queryset` to prevent N+1 queries.45- Use `permission_classes` on every view. Default to `IsAuthenticated` — explicitly set `AllowAny` only when needed.46- Use `@action` decorator for custom endpoints on viewsets: `@action(detail=True, methods=['post'])`.47- Implement pagination: use `PageNumberPagination` or `CursorPagination` for large datasets.48- Return consistent response shapes. Use DRF's built-in response formatting.4950## URL Routing5152- Use DRF `DefaultRouter` for viewset URL registration.53- Use `path()` over `re_path()` unless regex is genuinely needed.54- Namespace all app URLs: `app_name = 'users'` and `path('users/', include('users.urls', namespace='users'))`.55- Use `reverse()` or `reverse_lazy()` for URL generation. Never hardcode URL paths.56- Keep URL patterns RESTful: `users/`, `users/<int:pk>/`, `users/<int:pk>/activate/`.5758## ORM Best Practices5960- Use `QuerySet` methods for database operations. Never write raw SQL unless absolutely necessary.61- Chain QuerySet methods for readability: `User.objects.filter(...).select_related(...).order_by(...)`.62- Use `F()` expressions for database-level field references in queries and updates.63- Use `Q()` objects for complex lookups (OR conditions, negations).64- Use `annotate()` and `aggregate()` for computed fields and summaries.65- Use `Subquery` and `OuterRef` instead of multiple queries for correlated lookups.66- Avoid `QuerySet.all()` without pagination or limits — always scope your queries.67- Use `bulk_create`, `bulk_update` for batch operations. Set `batch_size` for large datasets.68- Use `transaction.atomic()` for operations that must succeed or fail together.6970## Error Handling7172- Use DRF exception handling. Raise `ValidationError`, `NotFound`, `PermissionDenied` from `rest_framework.exceptions`.73- Create custom exception classes for domain-specific errors. Register them with `EXCEPTION_HANDLER` in settings.74- Validate at the serializer level (field validation, object validation) and the model level (`clean()` method).75- Log all unhandled exceptions with request context. Use `structlog` or Django's logging configuration.76- Return consistent error response format: `{"detail": "message"}` or `{"field_name": ["error messages"]}`.77- Never expose internal error details (tracebacks, SQL queries) in API responses.7879## Authentication and Permissions8081- Use `django-rest-framework-simplejwt` for JWT authentication, or session auth for browser-based apps.82- Create custom permission classes for business logic authorization. Place them in `permissions.py` per app.83- Use object-level permissions when access depends on the specific resource (e.g., owner-only access).84- Implement role-based access with Django groups or a custom permission model.8586## Testing8788- Use `pytest-django` with `pytest`. Configure in `pytest.ini` or `pyproject.toml`.89- Use `APIClient` for DRF endpoint tests. Test each endpoint: success, validation, auth, permissions, edge cases.90- Use `baker` (model-bakery) or `factory_boy` for test data creation. Never use fixtures for dynamic test data.91- Use `@pytest.mark.django_db` for tests that need database access.92- Test model methods, validators, and signals in isolation.93- Place tests in `tests/` directory per app: `tests/test_views.py`, `tests/test_models.py`, `tests/test_serializers.py`.94- Use `override_settings` decorator for tests that need different settings.9596## File Structure9798```99project/100 config/101 settings/102 base.py103 development.py104 production.py105 urls.py106 wsgi.py107 asgi.py108 apps/109 core/ — Shared models, utils, base classes110 models.py — TimeStampedModel, etc.111 users/112 models.py113 serializers.py114 views.py115 urls.py116 permissions.py117 signals.py118 admin.py119 tests/120 test_views.py121 test_models.py122 articles/123 models.py124 serializers.py125 views.py126 urls.py127 filters.py128 tests/129 manage.py130 requirements/131 base.txt132 development.txt133 production.txt134```135136## Performance137138- Always use `select_related` (ForeignKey, OneToOne) and `prefetch_related` (ManyToMany, reverse FK) in querysets.139- Use Django Debug Toolbar in development to catch N+1 queries.140- Cache expensive computations with Django's cache framework. Use `@cache_page` for view caching.141- Use database indexes for frequently filtered and ordered fields.142- Use `defer()` and `only()` to limit fields loaded from the database when you don't need all columns.143- Paginate all list endpoints. Never return unbounded querysets.144145## Security146147- Keep `SECRET_KEY` in environment variables. Never commit it to version control.148- Set `ALLOWED_HOSTS` explicitly in production. Never use `['*']`.149- Use Django's CSRF protection. Do not disable it for API endpoints served to browsers.150- Enable security middleware: `SecurityMiddleware`, HSTS, content type sniffing protection.151- Validate and sanitize all user input through serializers. Escape output in templates.152- Use `SECURE_SSL_REDIRECT = True` in production.153- Regularly update Django and all dependencies for security patches.154
Also in survivorforge/cursor-rules
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| survivorforge/cursor-rulesrules/ai-ml-python/.cursorrules · 16 | .cursorrules | teststylearchdeployment+2 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/api-design-rest/.cursorrules · 16 | .cursorrules | lint-formatstylesecurityapi+3 | 69/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/api-microservices/.cursorrules · 16 | .cursorrules | buildteststylearch+5 | 92/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/aws-serverless/.cursorrules · 16 | .cursorrules | teststylearchtypes+6 | 73/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/chrome-extension/.cursorrules · 16 | .cursorrules | teststylearchtesting-strategy+4 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/clean-code/.cursorrules · 16 | .cursorrules | styledo-notagent-behaviourdocs | 57/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/database-sql/.cursorrules · 16 | .cursorrules | styletypessecuritydatabase+3 | 65/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/devops-docker/.cursorrules · 16 | .cursorrules | setupbuildteststyle+4 | 93/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/devops-infrastructure/.cursorrules · 16 | .cursorrules | buildteststylesecurity+3 | 93/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/django-rest/.cursorrules · 16 | .cursorrules | buildteststylearch+5 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/docker-devops/.cursorrules · 16 | .cursorrules | setupteststylearch+6 | 85/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/flutter-dart/.cursorrules · 16 | .cursorrules | teststylearchtypes+5 | 89/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/fullstack-nextjs-prisma/.cursorrules · 16 | .cursorrules | teststylearchtypes+7 | 96/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/go-gin/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+5 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/go-production/.cursorrules · 16 | .cursorrules | teststylearchtesting-strategy+3 | 89/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/golang-api/.cursorrules · 16 | .cursorrules | buildteststylearch+6 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/langchain-ai/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+4 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mcp-server/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+7 | 68/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mern-stack/.cursorrules · 16 | .cursorrules | setupteststylearch+6 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mobile-react-native/.cursorrules · 16 | .cursorrules | teststylearchtypes+7 | 89/100 | 2 days ago |
Diff against rules/ai-ml-python/.cursorrules Diff against rules/api-design-rest/.cursorrules Diff against rules/api-microservices/.cursorrules Diff against rules/aws-serverless/.cursorrules Diff against rules/chrome-extension/.cursorrules Diff against rules/clean-code/.cursorrules Diff against rules/database-sql/.cursorrules Diff against rules/devops-docker/.cursorrules Diff against rules/devops-infrastructure/.cursorrules Diff against rules/django-rest/.cursorrules Diff against rules/docker-devops/.cursorrules Diff against rules/flutter-dart/.cursorrules Diff against rules/fullstack-nextjs-prisma/.cursorrules Diff against rules/go-gin/.cursorrules Diff against rules/go-production/.cursorrules Diff against rules/golang-api/.cursorrules Diff against rules/langchain-ai/.cursorrules Diff against rules/mcp-server/.cursorrules Diff against rules/mern-stack/.cursorrules Diff against rules/mobile-react-native/.cursorrules
