django мягкое удаление не каскадное удаление - PullRequest
4 голосов
/ 04 июля 2011

Я использую мягкое удаление в моем администраторе django, сделанное как this . Проблема в том, что когда я удаляю элемент внешнего ключа, кажется, что он не вызывает удаления для всех элементов, с которыми он связан. Или, может быть, это так, но он не работает с пользовательским def delete , установленным на моей модели.

-Если я удаляю людей, они удаляются мягко, но соответствующая учетная запись остается нетронутой.

-Если я удаляю программные удаления, то, когда я удаляю человека, удаляются и учетные записи, что является правильным.

Таким образом, в идеале, когда я удаляю человека, я бы хотел, чтобы он мягко удалял человека и учетные записи, ссылающиеся на человека, которые также должны быть удалены (помечая их неактивными).

class Person(models.Model):
    description = models.CharField(max_length=100)

    def delete(self, *args, **kwargs):
        self.active = False
        self.deleted_date = datetime.now()
        self.save()

class Account(models.Model):
    name = models.CharField(max_length=50)
    person = models.ForeignKey(Person, null=True, blank=True)
    active = models.BooleanField(default=True, editable=False)

    objects = SoftDeleteManager()

    def delete(self, *args, **kwargs):
        self.active = False
        self.deleted_date = datetime.now()
        self.save()

    def __unicode__(self):
        return "%s: %s" % (self.type,self.name)

ОБНОВЛЕНИЕ: Я обновил вопрос. Я не сказал, что я запускаю мягкое удаление на модели Person. Также добавлено, что при удалении def не переопределяется, что каскадное удаление удаляет работу, но когда я переопределяю удаление, каскадное включение не срабатывает.

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Ваша модель Person в настоящее время не предназначена для "мягкого" удаления.Когда вы удаляете объект Person, Django удалит все связанные Account объекты.Если вы хотите мягко удалить объекты Person, добавьте флаг для этого в модели Person.Затем вам нужно убедиться, что ваш менеджер по умолчанию Account исключает те учетные записи, которые связаны с мягко удаленным объектом Person.

Редактировать:

  1. Один из подходов заключается в том, чтобы менеджер по умолчанию исключал объекты, связанные с неактивными объектами Person, вместо того, чтобы устанавливать их как «удаленные»:

      class AccountManager(models.Manager): 
          def get_query_set(self):
              return self.filter(person__active=True).filter(active=True)
    
  2. Другим подходом будет настройка связанных объектов Account.«удалено», когда объект Person подвергается мягкому удалению.Для этого вы можете использовать сигнал.Я думаю, что сигнал после сохранения на объектах Person был бы уместен.

0 голосов
/ 13 августа 2011

Альтернативным решением будет использование django-softdelete, пакета Django, недавно появившегося на github: https://github.com/scoursen/django-softdelete

Если вы используете прилагаемый миксин SoftDeleteObject для своих моделей, удаление их автоматически приведет кмягкое удаление также всех связанных моделей.Еще лучше то, что в нем хранятся все модели, относящиеся к программному удалению, так что вы также можете восстановить их все одним вызовом восстановления.

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