Подтвердить что ты не робот

Django: Когда настраивать save vs с помощью сигнала после сохранения

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

1) Измените функцию сохранения в подвыборках даты окончания.
2) Создайте ресивер, который прослушивает сохранение тестовых моделей, а затем завершает их подсерии.

Любая причина использовать другую, чем другую?

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

Edit2. Кроме того, для записи полная иерархия - это протокол → Test → Case → Planned_Execution, и каждый раз, когда вы закончите end_dated, каждый ребенок также должен быть endDated. Я полагаю, что в конечном итоге я сделаю в основном то же самое для каждого.

Edit3. Оказывается, что для того, чтобы определить, является ли текущее сохранение() тем, что является endDating Test, мне нужно иметь доступ к старым данным и новым данным, поэтому Я использовал обычное сохранение. Вот как это выглядит:

def save(self):
    """Use a custom save to end date any subCases"""
    try:
        orig = Test.objects.get(id=self.id)
        enddated = (not orig.end_date) and self.end_date is not None   
    except:
        enddated = False

    super(Test, self).save()

    if enddated:
        for case in self.case_set.exclude(end_date__isnull=False):
            case.end_date = self.end_date
            case.enddater = self.enddater
            case.save()
4b9b3361

Ответ 1

Обычно я использую это правило:

  • Если вам нужно изменить данные, чтобы сэкономить не удалось, переопределите save() (у вас действительно нет другой опции). Например, в приложении, над которым я работаю, у меня есть модель с текстовым полем, в котором есть список вариантов. Это связано со старым кодом и заменяет более старую модель с похожим текстовым полем, но с другим списком вариантов. Старый код иногда передает моей модели выбор из старой модели, но есть сопоставление 1:1 между выборами, поэтому в этом случае я могу изменить выбор на новый. Имеет смысл сделать это в save().
  • В противном случае, если сохранение может продолжаться без вмешательства, я обычно использую сигнал после сохранения.

Ответ 2

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