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オブジェクトは、日付と時刻でソートされたイベントを表します。'opening'または'closeing'イベントが交互になっていることを確認する必要があります(つまり、'opening'または'closeing'イベントが2つ連続していない)。したがって、'opening'イベントを別の'opening'イベントの後に挿入しようとすると挿入は防止されますが、これを行う方法がわかりません。

オーバーライドされた保存メソッドで既存のレコードのチェックを実装する必要がありますか?

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 に答える