如何在Django中强制关联字段?

时间:2016-10-13 08:33:03

标签: python django django-models relationship

假设我在Django中有以下多对一关系:

from django.db import models

class Person(models.Model):
    # ...

class Address(models.Model):
    # ...
    person = models.ForeignKey(Person, on_delete=models.CASCADE)

这允许一个人拥有多个地址。

我希望强制要求一个人至少拥有一个地址,这样就无法在数据库中保存没有地址的人。

我如何实现这一目标?是否可以强制使用相关字段(可以使用blank=False对“普通”字段执行此操作)?

2 个答案:

答案 0 :(得分:1)

如前所述,没有办法直接在数据库上强制实施关系。

但是,您可以通过在使用clean()方法保存之前验证模型来处理它。它将在为Django模型保存时自动触发。

class Person(models.Model):
    .
    .
    .
    def clean(self):
        if len(self.addresses) == 0:
            raise ValidationError('At least one address is required.')

答案 1 :(得分:0)

为什么不在Person上建立多对多的关系?这似乎是您数据的更自然的表达。

但无论如何,你无法真正对数据库实施多对多的实施。您可以覆盖Person的保存以检查地址。但我更愿意在表单逻辑中处理它。