我有一个用例,我想验证字段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 ...)
)
)
换句话说,仅当角色列在群组的角色中时,才允许该成员拥有该角色。我不知道如何表达。
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
。