django如何在插入过程中对其他记录执行检查

时间:2012-12-23 16:51:13

标签: django django-models

我有以下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对象表示按日期和时间排序的事件。 我需要确保'开启'或'关闭'事件是交替的(即没有两个连续'开启'或'关闭'事件),所以如果我尝试在另一个'开放'事件之后插入'开放'事件插入被阻止,但我不知道如何实现这一目标。

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

1 个答案:

答案 0 :(得分: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)