Как сделать модель активной/неактивной, не удаляя ее, Django?
Я хочу развернуть способ активировать/инактивировать модель без ее удаления, как в модели User, которая имеет поле is_active, с помощью которого мы можем деактивировать пользователя, поэтому я хочу сделать то же самое с моделями.
Есть ли решения для этого?
Возможно, вы можете создать класс BaseModel, имеющий свойство is_active, от которого наследуют все остальные модели.
Далее вы захотите переопределить метод delete на BaseModel, чтобы при вызове delete она инактивировалась. Вы также можете добавить функцию really_delete, которая вызывает обычную функцию delete, если вы действительно хотите удалить if из БД.
class BaseModel(models.Model):
class Meta:
abstract = True
is_active = models.BooleanField(default=True)
def delete(self):
self.is_active = False
self.save()
def undelete(self):
self.is_active = True
self.save(request=request)
def really_delete(self):
super().delete()
Добавьте поле is_active и переопределите метод delete.
class Foo(models.Model):
is_active = models.BooleanField(verbose_name='is active?', default=True)
remove_datetime = models.DateTimeField(verbose_name='remove date', blank=True, null=True)
def delete(self, purge=False, using=None, keep_parents=False):
if purge:
return super(TrackedModel, self).delete(using, keep_parents)
else:
self.remove_datetime = timezone.now()
self.is_active = False
self.save()
Для аккуратного прихватывания модели я использую такие модели:
from django.db import models
from django.utils import timezone
class TimedModel(models.Model):
created = models.DateTimeField(default=timezone.now, verbose_name='created')
modified = models.DateTimeField(default=timezone.now, verbose_name="last modified")
def save(self, *args, **kwargs):
now = timezone.now()
if not self.id:
self.created = now
self.modified = now
return super(TimedModel, self).save(*args, **kwargs)
class Meta:
ordering = ('-created',)
abstract = True
class TrackedModel(TimedModel):
class Meta:
abstract = True
is_active = models.BooleanField(verbose_name='is active?', default=True)
remove_datetime = models.DateTimeField(verbose_name='remove date', blank=True, null=True)
def delete(self, purge=False, using=None, keep_parents=False):
if purge:
return super(TrackedModel, self).delete(using, keep_parents)
else:
self.remove_datetime = timezone.now()
self.is_active = False
self.save()