Django模型同一模型的外键我不应该在我的例子中添加相同的模型

时间:2016-05-08 10:43:42

标签: django django-models

class Test(models.Model):
    name = models.CharField(max_length=100)

class TestToExample(models.Model):
    example1 = models.ForeignKey(Test,related_name='example1')    
    example2 = models.ForeignKey(Test,related_name='example2')

在这里,我可以将example1添加到Test,将示例2添加到Test I,不应该这样做。例1和& 2不应该具有相同的测试值。

1 个答案:

答案 0 :(得分:1)

您可以覆盖模型的save()方法:

class TestToExample(models.Model):
    example1 = models.ForeignKey(Test,related_name='example1')    
    example2 = models.ForeignKey(Test,related_name='example2')

    def save(self, force_insert=False, force_update=False, 
             using=None, update_fields=None):
        assert self.example1 != self.example2
        # Or:
        # if self.example1 == self.example2:
        #     raise WhateverError
        super(TestToExample, self).save(
            force_insert=force_insert, force_update=force_update, using=using, 
            update_fields=update_fields)

这通常会禁止您拥有无效的模型状态(通过bulk_create()创建实例除外)。如果您通过管理员或模型表单保存实例,最好覆盖模型的clean()方法,并在那里提出ValidationError(请参阅documentation)为了提供正确的错误消息而不是内部服务器错误:

class TestToExample(models.Model):
    ...
    def clean(self):
        if self.example1 == self.example2:
            raise ValidationError('example1 and example2 must be different')
        super(TestToExample, self).clean()