Форум сайта python.su
Есть определенный класс моделей, для которых хотелось бы запретить удаление записей.
Вместо удаления снимать признак активности - булевое поле is_active, определенное для такого класса моделей.
Для такого класса определил менеджера, который возвращает только активные объекты.
Можно переопределить метод Model.delete, но при этом остается еще метод пакетного удаления QuerySet.delete, который не понятно как переопределять.
Как бы получше переопределить удаление объектов? Или возможны другие варианты, явно запрещающие удалять объекты. Возможно через использование permission.
Кто и что посоветует?
Офлайн
Да можно переопределить метод модели. По поводу QuerySet в таком случае оф. документация гоыорит
If you've provided a custom delete() method on a model class and want to ensure that it is called, you will need to “manually” delete instances of that model (e.g., by iterating over a QuerySet and calling delete() on each object individually) rather than using the bulk delete() method of a QuerySetТ.е. придётся забыть про стандартный метод querySet'а и удалять записи итератором “вручную”.
Офлайн
FerromanНе вижу проблем чтобы переопределить delete и у QuerySet.
Т.е. придётся забыть про стандартный метод querySet'а и удалять записи итератором “вручную”.
Офлайн
FerromanДа, я именно поэтому и задумался.
Т.е. придётся забыть про стандартный метод querySet'а и удалять записи итератором “вручную”.
DaevaornВ принципе да, возможен вариант, когда дефолтный менеджер модели будет возвращать “мой” переопределенный QuerySet.
Не вижу проблем чтобы переопределить delete и у QuerySet.
Офлайн
Я бы QuerySet не трогал. Всё-таки “Special cases aren't special enough to break the rules”.
Переопределять части внешнего инструмента - не то же, что и свою модель.
Отредактировано (Дек. 9, 2009 02:32:05)
Офлайн
FerromanВот и опасаюсь.
Я бы QuerySet не трогал. Всё-таки “Special cases aren't special enough to break the rules”.
Переопределять части внешнего инструмента - не тоже, что и свою модель.
# Наследуюсь от QuerySet
class DescriptorQuerySet(query.QuerySet):
def delete(self):
self.update(is_active=False) # вот и все переопределение
class DescriptorManager(models.Manager):
def get_query_set(self):
return DescriptorQuerySet(self.model) # возвращаем переопределенный QuerySet
class Descriptor(models.Model):
is_active = models.BooleanField()
objects = DescriptorManager() # задаем менеджера модели
Офлайн
А поддерживать как?
Офлайн
FerromanВ каком смысле?
А поддерживать как?
Офлайн
В смысле обновлять джангу, да и поддерживать код.
Но, хозяин - барин.
Офлайн
FerromanГхм!
В смысле обновлять джангу, да и поддерживать код.
Офлайн