Django: когда настраивать сохранение и использовать сигнал после сохранения - PullRequest
20 голосов
/ 08 апреля 2011

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

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

Есть ли какая-либо причина использовать один, а не другой?

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

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

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

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()

Ответы [ 2 ]

24 голосов
/ 08 апреля 2011

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

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

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

...