User Tools

Site Tools


django

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

django [2026/03/27 00:36] – Create Django snippets page with common patterns rogerdjango [2026/03/27 00:52] (current) – Add migrations, signals, and DRF sections roger
Line 165: Line 165:
 </code> </code>
  
 +
 +===== Migrations =====
 +
 +==== Squash migrations ====
 +
 +<code bash>
 +python manage.py squashmigrations myapp 0001 0015
 +</code>
 +
 +==== Create an empty migration (for data migrations) ====
 +
 +<code bash>
 +python manage.py makemigrations myapp --empty -n my_data_migration
 +</code>
 +
 +==== Data migration template ====
 +
 +<code python>
 +from django.db import migrations
 +
 +
 +def forwards(apps, schema_editor):
 +    MyModel = apps.get_model("myapp", "MyModel")
 +    for obj in MyModel.objects.filter(status="old"):
 +        obj.status = "new"
 +        obj.save(update_fields=["status"])
 +
 +
 +def backwards(apps, schema_editor):
 +    pass  # or reverse the migration
 +
 +
 +class Migration(migrations.Migration):
 +    dependencies = [
 +        ("myapp", "0015_previous"),
 +    ]
 +
 +    operations = [
 +        migrations.RunPython(forwards, backwards),
 +    ]
 +</code>
 +
 +===== Signals =====
 +
 +==== Post-save signal ====
 +
 +<code python>
 +from django.db.models.signals import post_save
 +from django.dispatch import receiver
 +
 +@receiver(post_save, sender=User)
 +def create_profile(sender, instance, created, **kwargs):
 +    if created:
 +        Profile.objects.create(user=instance)
 +</code>
 +
 +===== Django REST Framework =====
 +
 +==== Serializer with nested write support ====
 +
 +<code python>
 +class AddressSerializer(serializers.ModelSerializer):
 +    class Meta:
 +        model = Address
 +        fields = ["street", "city", "country"]
 +
 +
 +class UserSerializer(serializers.ModelSerializer):
 +    address = AddressSerializer()
 +
 +    class Meta:
 +        model = User
 +        fields = ["name", "email", "address"]
 +
 +    def create(self, validated_data):
 +        address_data = validated_data.pop("address")
 +        user = User.objects.create(**validated_data)
 +        Address.objects.create(user=user, **address_data)
 +        return user
 +</code>
 +
 +==== Custom permission ====
 +
 +<code python>
 +from rest_framework.permissions import BasePermission
 +
 +class IsOwner(BasePermission):
 +    def has_object_permission(self, request, view, obj):
 +        return obj.owner == request.user
 +</code>
 +
 +==== Pagination ====
 +
 +<code python>
 +# settings.py
 +REST_FRAMEWORK = {
 +    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
 +    "PAGE_SIZE": 25,
 +}
 +
 +# Or custom pagination
 +from rest_framework.pagination import CursorPagination
 +
 +class CreatedAtCursorPagination(CursorPagination):
 +    ordering = "-created_at"
 +    page_size = 50
 +</code>
 ===== See Also ===== ===== See Also =====
  
   * [[django:links|Django Links]] - Useful Django resources and references   * [[django:links|Django Links]] - Useful Django resources and references
  
django.txt · Last modified: 2026/03/27 00:52 by roger