Django:验证外键之间的关系

roejwanj  于 2023-01-18  发布在  Go
关注(0)|答案(1)|浏览(127)

我有一个Run模型,其中有两个ForeignKeysignupreport

class Run(models.Model):
    signup = models.ForeignKey(Signup, on_delete=models.CASCADE, related_name="runs")
    report = models.ForeignKey(Report, on_delete=models.CASCADE, related_name="runs")
    kind = ...

指向模型,该模型又与另一个模型,Training

class Report(models.Model):
    training = models.OneToOneField(
        Training, on_delete=models.CASCADE, primary_key=True
    )
    cash_at_start = ....

class Signup(models.Model):
    training = models.ForeignKey(
        Training, on_delete=models.CASCADE, related_name="signups"
    )
    participant = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="signups"
    )

在创建Run时,我希望确保signupreport用于相同的Training,即report.training == signup.training
这种验证叫什么?我该如何实现它?
此外,如果另一种数据库结构会更好,我很乐意学习其他实现方法。

fbcarpbf

fbcarpbf1#

以下是描述模型验证过程的文档。
请注意,此验证通常只在ModelForms(调用form.is_valid()时)时发生。如果不调用model_instance.full_clean()方法,则手动创建对象并使用save()不会触发此验证。它针对的是用户,而不是开发人员。
根据上面提到的文档,我的建议是使用clean方法:

class Run(models.Model):
    signup = models.ForeignKey(Signup, on_delete=models.CASCADE, related_name="runs")
    report = models.ForeignKey(Report, on_delete=models.CASCADE, related_name="runs")

    def clean(self):
        if self.signup.training != self.report.training:
            # Note: adding an error code is best practice :)
            raise ValidationError('some message', code='some_error_code')

相关问题