如何添加基于列值限制外键数量的 Django 约束?



请考虑以下代码:

(使用 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,以便每个父级允许的孩子数量受到Parentlimit字段的限制。例如,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, ))

最新更新