Django 模型中的复杂约束

问题描述 投票:0回答:1

我有一个用例,我想验证字段foreignkey值是否在特定的集合中,所以像:

class Role(models.Model):
    label = models.CharField(max_length=24)

class Group(models.Model):
    roles = models.ManyToManyField(Role, null=False)

class Member(models.Model):
    label = models.CharField(max_length=24)
    group = models.ForeignKey(Group)
    role = models.ForeignKey(Role)

    class Meta:
        constraints = [
            models.CheckConstraint(
                name="%(app_label)s_%(class)s_role",
                check=(
                    models.Q(role__in=... valid roles ...)
                )
            )

换句话说,仅当角色列在群组的角色中时,才允许该成员拥有该角色。我不知道如何表达。

django django-models
1个回答
0
投票

您不能使用

CheckConstraint
执行此操作:此类约束可以跨越整行,而不是多个表。因此它不能“遵循”
ForeignKey
或其他关系。

一个想法可能是不是来引用

Group
Role
,而是引用Django为ManyToManyField创建的
连接表
,例如:

class Role(models.Model):
    label = models.CharField(max_length=24)


class Group(models.Model):
    roles = models.ManyToManyField(Role, null=False)


class Member(models.Model):
    label = models.CharField(max_length=24)
    group_role = models.ForeignKey(Group.roles.through, on_delete=models.PROTECT)

    @property
    def group(self):
        return self.group_role.group

    @property
    def role(self):
        return self.group_role.role

因此它只能引用

GroupRoles
表中的记录,从而引用
Group
Role
,因此
FOREIGN KEY
约束将保证我们选择的角色组组合意味着
 Role
可用于
Group

© www.soinside.com 2019 - 2024. All rights reserved.