1

我有以下 Django 模型:

class BarEvent(models.Model):
    EVENT_TYPES = ( ('op', 'opening'), ('cl', 'closing'), ('ea', 'event_a'), ('eb','event_b')   )

    event_type = models.CharField(max_length=2, choices=BAR_BALANCE_TYPES)
    date = models.DateField("Data", default=datetime.now)

其中 BarEvent 对象表示按日期和时间排序的事件。我需要确保交替出现“打开”或“关闭”事件(即没有两个连续的“打开”或“关闭”事件),所以如果我尝试在另一个“打开”事件之后插入一个“打开”事件插入被阻止,但我不知道如何做到这一点。

我应该在覆盖的保存方法中对现有记录进行检查吗?

4

1 回答 1

1

您可以在模型中编写一个clean方法来在实际保存对象之前检查额外的验证。

class BarEvent(models.Model):
    EVENT_TYPES = ( ('op', 'opening'), ('cl', 'closing'), ('ea', 'event_a'), ('eb','event_b')   )

    event_type = models.CharField(max_length=2, choices=BAR_BALANCE_TYPES)
    date = models.DateField("Data", default=datetime.now)

    def clean(self):
        """
            Custom clean method to validate there can not be two
            consecutive events of same type
        """

        if self.objects.latest('date').event_type == self.event_type:
            raise ValidationError('Consecutive events of same type %s' % self.event_type)
于 2012-12-23T16:57:07.667 回答