حذف داده (Django Delete Data)
حذف داده: پاک کردن اطلاعات از دیتابیس 🗑️
گاهی نیاز داریم دادههای قدیمی یا غیرضروری رو از دیتابیس حذف کنیم. جنگو روشهای مختلفی برای این کار داره که باید با دقت استفاده بشن!
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) # فقط پستهای فعال
🎯 تمرین عملی:
یک مدل Comment بسازید که به Post لینک شده. سپس یک پست و چند کامنت براش بسازید. حالا پست رو حذف کنید و ببینید چه اتفاقی برای کامنتها میافته (با on_delete=models.CASCADE و بعد با on_delete=models.PROTECT).
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
🎯 تمرین عملی: Soft Delete
در این تمرین، یک سیستم Soft Delete میسازیم:
- یک متد
soft_delete()به مدل اضافه کنید - یک متد
restore()برای بازیابی پستهای حذف شده - یک Manager سفارشی بسازید که فقط پستهای حذف نشده رو برگردونه
راهنمایی: از models.Manager برای ساخت manager سفارشی استفاده کنید.
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() # همه پستها (شامل حذف شدهها)
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.