Как в модели 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.')

Я приветствую улучшения или лучшие ответы!

Другие вопросы по тегам