[英]Django: Validate relationships among ForeignKeys
我有一個帶有兩個ForeignKey
的 model Run
, signup
和report
,
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 = ...
指向模型,而模型又與另一個 model 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
時,我想確保它的signup
和report
是針對同一個Training
的,即report.training == signup.training
。
這種驗證叫什么? 我將如何實現它?
另外,我很高興學習其他方法來實現這一點,如果另一種數據庫結構會更好的話。
以下是描述模型驗證過程的文檔。
請注意,這種驗證通常只發生在 ModelForms 中(調用ModelForms
form.is_valid()
時)。 如果您不調用model_instance.full_clean()
方法,則手動創建 object 並使用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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.