Python 如何在Django中强制设置相关字段?
假设我在Django中有以下多对一关系:Python 如何在Django中强制设置相关字段?,python,django,django-models,relationship,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) 这允许一个人有多个地址 我希望强制规定一个人至少有一个地址,因此不可能在DB中保存一个没有地址的人 我怎样才能
from django.db import models
class Person(models.Model):
# ...
class Address(models.Model):
# ...
person = models.ForeignKey(Person, on_delete=models.CASCADE)
这允许一个人有多个地址
我希望强制规定一个人至少有一个地址,因此不可能在DB中保存一个没有地址的人
我怎样才能达到这个目标?是否可以将相关字段设置为必填字段(对于“正常”字段,可以使用
blank=False
)?为什么不将地址设置为Person上的多对多关系?这似乎是数据更自然的表达方式
但不管怎样,您不能在db上真正实施多对多的实现。您也许可以覆盖Person的save来检查地址。但我更愿意用逻辑的形式来处理它 如前所述,无法直接在数据库上强制执行关系 但是,您可以通过在保存之前使用
clean()
方法验证模型来解决此问题。对于Django型号,它将在保存时自动触发
class Person(models.Model):
.
.
.
def clean(self):
if len(self.addresses) == 0:
raise ValidationError('At least one address is required.')