دوره‌ها / Django / حذف داده (Django Delete Data)

حذف داده (Django Delete Data)

20 دقیقه Article

حذف داده: پاک کردن اطلاعات از دیتابیس 🗑️

گاهی نیاز داریم داده‌های قدیمی یا غیرضروری رو از دیتابیس حذف کنیم. جنگو روش‌های مختلفی برای این کار داره که باید با دقت استفاده بشن!

هشدار مهم: حذف داده‌ها یک عمل غیرقابل برگشته! همیشه قبل از حذف، مطمئن بشید که واقعاً می‌خواید اون داده رو پاک کنید. در محیط تولید، بهتره از "Soft Delete" استفاده کنید (به جای حذف واقعی، یک فیلد is_deleted رو True کنید).

حذف یک رکورد

برای حذف یک رکورد خاص:

# حذف یک رکورد
post = Post.objects.get(id=1)
post.delete()

# حذف چندین رکورد
Post.objects.filter(published=False).delete()

# حذف همه
Post.objects.all().delete()

حذف چندین رکورد

می‌تونید چندین رکورد رو یکجا حذف کنید:

# حذف پست‌های منتشر نشده
Post.objects.filter(published=False).delete()

# حذف پست‌های قدیمی‌تر از 1 سال
from datetime import datetime, timedelta
one_year_ago = datetime.now() - timedelta(days=365)
Post.objects.filter(created_at__lt=one_year_ago).delete()

حذف با ForeignKey:

وقتی یک رکورد با ForeignKey حذف میشه، رفتارش بستگی به on_delete داره:

  • CASCADE: رکوردهای مرتبط هم حذف میشن (خطرناک!)
  • PROTECT: اگر رکورد مرتبط وجود داشته باشه، حذف نمیشه
  • SET_NULL: فیلد ForeignKey رو null می‌کنه
  • SET_DEFAULT: فیلد رو به مقدار پیش‌فرض تنظیم می‌کنه

Soft Delete (حذف نرم)

به جای حذف واقعی، می‌تونید یک فیلد boolean اضافه کنید:

# مدل با Soft Delete
class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    is_deleted = models.BooleanField(default=False)
    
    def delete(self):
        # به جای حذف واقعی، فقط علامت می‌ذاریم
        self.is_deleted = True
        self.save()
    
    class Meta:
        # فقط پست‌های حذف نشده رو نمایش بده
        pass

# استفاده
Post.objects.filter(is_deleted=False)  # فقط پست‌های فعال
بهترین روش: در پروژه‌های واقعی، همیشه از Soft Delete استفاده کنید. این کار به شما امکان بازیابی داده‌ها رو میده و از دست دادن اطلاعات رو جلوگیری می‌کنه.

🎯 تمرین عملی:

یک مدل Comment بسازید که به Post لینک شده. سپس یک پست و چند کامنت براش بسازید. حالا پست رو حذف کنید و ببینید چه اتفاقی برای کامنت‌ها می‌افته (با on_delete=models.CASCADE و بعد با on_delete=models.PROTECT).

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

تمرین: حذف امن داده‌ها Hard
سوال تمرین

🎯 تمرین عملی: Soft Delete

در این تمرین، یک سیستم Soft Delete می‌سازیم:

  1. یک متد soft_delete() به مدل اضافه کنید
  2. یک متد restore() برای بازیابی پست‌های حذف شده
  3. یک Manager سفارشی بسازید که فقط پست‌های حذف نشده رو برگردونه

راهنمایی: از models.Manager برای ساخت manager سفارشی استفاده کنید.

پاسخ تمرین
PYTHON
from django.db import models
from django.utils import timezone

class ActivePostManager(models.Manager):
    def get_queryset(self):
        # فقط پست‌های حذف نشده رو برگردون
        return super().get_queryset().filter(is_deleted=False)

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    is_deleted = models.BooleanField(default=False)
    deleted_at = models.DateTimeField(null=True, blank=True)
    
    objects = models.Manager()  # manager پیش‌فرض (همه پست‌ها)
    active = ActivePostManager()  # manager سفارشی (فقط پست‌های فعال)
    
    def soft_delete(self):
        # Soft delete: به جای حذف واقعی، فقط علامت می‌ذاریم
        self.is_deleted = True
        self.deleted_at = timezone.now()
        self.save()
    
    def restore(self):
        # بازیابی پست حذف شده
        self.is_deleted = False
        self.deleted_at = None
        self.save()
    
    def __str__(self):
        return self.title

# استفاده:
# Post.active.all()  # فقط پست‌های فعال
# Post.objects.all()  # همه پست‌ها (شامل حذف شده‌ها)

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.