Как в модели Django как предотвратить удаление на основе определенного поля?
В следующем у меня есть Post
модель. Post
объект имеет status
поле, которое может быть 'unpublished'
или же 'published'
,
if status is 'published'
Я хотел бы предотвратить удаление объекта и хотел бы, чтобы эта логика была инкапсулирована в самой модели.
from model_utils import Choices # from Django-Model-Utils
from model_utils.fields import StatusField
class Post(model.Models)
STATUS = Choices(
('unpublished', _('Unpublished')),
('published', _('Published')),
)
...
status = StatusField(default=STATUS.unpublished)
Как я могу это сделать? Переопределение delete
Метод не будет работать, если объекты удаляются навсегда с QuerySet
, Я читал, чтобы не использовать приемники, но я не уверен, почему.
1 ответ
Решение
Вот что я написал после комментария @Todor:
В signals.py
:
from django.db.models import ProtectedError
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from .models import Post
@receiver(pre_delete, sender=Post, dispatch_uid='post_pre_delete_signal')
def protect_posts(sender, instance, using, **kwargs):
if instance.status is 'unpublished':
pass
else: # Any other status types I add later will also be protected
raise ProtectedError('Only unpublished posts can be deleted.')
Я приветствую улучшения или лучшие ответы!