Как сделать модель активной/неактивной, не удаляя ее, 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()

Вернуться на верх