Та же таблица Django ORM Мягкий метод удаления Хорошо? - PullRequest
1 голос
/ 22 июня 2009

Я использую следующую настройку для осуществления мягкого удаления в Django. Я не очень знаком с Django под капотом, поэтому я буду признателен за любые отзывы о проблемах, с которыми я могу столкнуться. Мне особенно неудобно создавать подклассы QuerySet.

Основная идея заключается в том, что первый вызов delete для MyModel изменяет MyModel date_deleted на текущую дату и время. Второй delete фактически удалит объект. (Для захвата delete требуется два переопределения, одно для объекта и одно для QuerySet, что может обойти метод delete объекта.) Поскольку менеджер по умолчанию будет скрывать удаленные объекты, удаленные объекты исчезают и должны быть явно запрошены через менеджера deleted_objects.

Использование этой настройки требует определения DeletionQuerySet и DeletionManager и добавления date_deleted, objects и deleted_objects к вашей модели.

Спасибо

P.S., Забыл упомянуть, что этот метод фильтрации объектов из менеджера по умолчанию настоятельно не рекомендуется !

class DeletionQuerySet(models.query.QuerySet):

    def delete(self):
        prev_deleted = self.filter(date_deleted__isnull=False)
        prev_deleted.actual_delete()
        prev_undeleted = self.filter(date_deleted__isnull=True)
        prev_undeleted.update(date_deleted=datetime.datetime.now())

    def actual_delete(self):
        super(DeletionQuerySet, self).delete()

class DeletionManager(models.manager.Manager):

    # setting use_for_related_fields to True for a default manager ensures
    # that this manager will be used for chained lookups, a la double underscore,
    # and therefore that deleted Entities won't popup unexpectedly.
    use_for_related_fields = True

    def __init__(self, hide_deleted=False, hide_undeleted=False):
        super(DeletionManager, self).__init__()
        self.hide_deleted = hide_deleted
        self.hide_undeleted = hide_undeleted

    def get_query_set(self):
        qs = DeletionQuerySet(self.model)
        if self.hide_deleted:
            qs = qs.filter(date_deleted__isnull=True)
        if self.hide_undeleted:
            qs = qs.filter(date_deleted__isnull=False)
        return qs

class MyModel(models.Model):

    # Your fields here...
    date_deleted = models.DateTimeField(null=True)

    #the first manager defined in a Model will be the Model's default manager
    objects = DeletionManager(hide_deleted=True)
    deleted_objects = DeletionManager(hide_undeleted=True)

    def delete(self):
        if self.date_deleted is None:
            self.date_deleted = datetime.datetime.now()
            self.save()
        else:
            super(Agreement, self).delete()

1 Ответ

1 голос
/ 26 июня 2010

Я думаю, что что-либо с текущими, популярными, технологиями, не может быть проблемного домена, общего удаления программ. Я думаю, что это больше связано с историческими / исторически ориентированными системами баз данных, чем с тем, что мы используем. Я рекомендую вам не обходить удаление django (которое сложно удалить). Хранить как есть.

«Удалить», которое вы, скорее всего, будете иметь в нашей системе, в 90% случаев - визуальное удаление ...

В связи с этим попробуйте найти синонимы с удалением для конкретной проблемы домена и сделайте это с самого начала проекта.

Поскольку жалуются, что IsVisible, IsUnpublished (даже IsDeleted) путают ваши запросы, они жалуются, что вы всегда должны быть осторожны, чтобы включать их ...

Но это, очевидно, незнание проблемы домена, если в домене есть объекты, которые можно сделать невидимыми или стать неопубликованными - конечно, когда вы запрашиваете список всех объектов, которые вы хотите отобразить, вы должны С НАЧАЛА, ЗАПРОСИТЬ ВСЕ ОБЪЕКТЫ, которые не видны и не опубликованы, потому что именно так ваша проблема домена решается в полной форме.

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...