请考虑以下代码:
(使用 Python 3.7 和 Django 2.2(
from django.core.validators import MinValueValidator
from django.db import models
class Parent(models.Model):
limit = models.IntegerField(validators=[MinValueValidator(1)])
class Child(models.Model):
parent = models.ForeignKey(Parent, related_name='children')
是否可以添加一个CheckConstraint
,以便每个父级允许的孩子数量受到Parent
limit
字段的限制。例如,Parent
表上的以下内容:
models.CheckConstraint(
check=models.Q(limit__gte=models.Count('children')),
name='children_limit',
)
但这失败了
django.core.exceptions.FieldError: Joined field references are not permitted in this query
澄清一下:我真的更愿意这样做一个数据库约束,我知道如何在 Python 领域做到这一点。
您可以在子模型上使用验证器,如下所示:
def restrict_amount(value):
parent = Parent.objects.filter(pk=value).get()
if parent.children.count() >= parent.limit:
raise ValidationError(f'Parent already has maximal amount of children ({parent.limit})')
class Child(models.Model):
parent = models.ForeignKey(Parent, related_name='children', validators=(restrict_amount, ))