Переопределение delete () и использование сигнала предварительного удаления - PullRequest
0 голосов
/ 28 августа 2018

У меня есть модель, в которой я хотел бы, чтобы объект удалялся, а не удалялся, статус обновляется. Это было достигнуто с помощью следующего кода:

def delete(self, using=None, keep_parents=False):
    self.status = Booking.DELETED
    self.save()

Менеджер был обновлен так, что в остальной части приложения я никогда не получаю представленные удаленные заказы.

class BookingManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().exclude(status=Booking.DELETED)

class BookingDeletedManager(models.Manager):
    def get_queryset(self):
         return super().get_queryset().filter(status=Booking.DELETED)

class Booking(models.Model):
    PAYED = 0
    PENDING = 1
    OPEN = 2
    CANCELLED = 3
    DELETED = 4
    objects = BookingManager()
    deleted_objects = BookingDeletedManager()
...  

Теперь я прочитал о сигналах django и мне было интересно, лучше ли использовать здесь сигнал предварительного удаления. Код можно изменить, чтобы в получателе предварительного удаления была создана копия со статусом «удален», а исходное бронирование было просто удалено.

В документации говорится, что эти сигналы следует использовать для , позволяющего отделенным приложениям получать уведомления, когда действия происходят в другом месте в рамках . Кажется, сигнал - хорошее решение, но этот нюанс в документации заставляет меня думать, что это, возможно, не то, что я хочу, и переопределение может быть просто подходом.

Это не совсем так, потому что я просто хочу эту функциональность все время. Так что мой вопрос в том, есть ли веская причина, почему я не должен отменять метод удаления и использовать сигнал предварительного удаления или наоборот?

1 Ответ

0 голосов
/ 28 августа 2018

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

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

В вашем случае использование сигналов моделей вместо просто переопределения метода модели будет анти-паттерном : это только увеличит накладные расходы и сделает ваш код менее читаемым по абсолютно без веской причине, когда очень очевидный Решение состоит в том, чтобы просто сделать то, что вы сделали.

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