无法检查查询集是否是一个子集
Unable to check if queryset is a subset
我有三个模型
class Permission(models.Model):
permission = models.CharField(max_length=255, null=False)
class PermissionMap(models.Model):
name = models.CharField(max_length=255, null=False)
origin = models.ForeignKey(Origin)
license = models.ForeignKey(License)
class Meta:
unique_together = (("origin", "license"),)
class PermissionValidatorMap(models.Model):
permission_map = models.ForeignKey(PermissionMap)
permission = models.ForeignKey(Permission)
validator_set = models.ManyToManyField(ValidatorMetaData)
class Meta:
unique_together = (("permission_map", "permission"),)
现在我正在做的是获取来源、许可证、许可和 validators_list(这是一个列表)并使用它们过滤 PermissionValidatorMap
map=PermissionValidatorMap.objects.filter(permission_map__origin=origin,\
permission_map__license=license, permission__permission=permission)
现在我只想过滤那些 validator_set 是 validators_list 的子集或完全匹配集的那些
为此,我正在做这样的事情
map.filter(validator_set__in=validators_list)
但这似乎不起作用,它似乎正在单独检查 validators_list 的每个元素,因此返回重复的结果和
即使整个 validator_set 不是 validator_list.
也会返回
为了说明它的行为有点像这种方式
[1,2,3] 中的 [a->1,2] 将给出 [a,a]
[2,3] 中的 [a->1,2] 将给出 [a]
在第一种情况下,它应该返回 [a],而在第二种情况下,它应该返回任何内容或为空
我该怎么做?
这是完全自然的行为。您的查询在 ValidatorMetaData
上生成 JOIN
,在 returns 上为每对 (PermissionValidatorMap, ValidatorMetaData)
生成 PermissionValidatorMap
,其中 ValidatorMetaData
与查询匹配。这里的关键是 validator_set__in
查找发生在 ValidatorMetaData
table 中。
要获得所需的行为,您必须排除在 validator_list
中具有相关 ValidatorMetaData
not 的每个 PermissionValidatorMap
,即:
PermissionValidatorMap.objects.exclude(
validator_set__in=ValidatorMetaData.objects.exclude(id__in=validator_list))
我有三个模型
class Permission(models.Model):
permission = models.CharField(max_length=255, null=False)
class PermissionMap(models.Model):
name = models.CharField(max_length=255, null=False)
origin = models.ForeignKey(Origin)
license = models.ForeignKey(License)
class Meta:
unique_together = (("origin", "license"),)
class PermissionValidatorMap(models.Model):
permission_map = models.ForeignKey(PermissionMap)
permission = models.ForeignKey(Permission)
validator_set = models.ManyToManyField(ValidatorMetaData)
class Meta:
unique_together = (("permission_map", "permission"),)
现在我正在做的是获取来源、许可证、许可和 validators_list(这是一个列表)并使用它们过滤 PermissionValidatorMap
map=PermissionValidatorMap.objects.filter(permission_map__origin=origin,\
permission_map__license=license, permission__permission=permission)
现在我只想过滤那些 validator_set 是 validators_list 的子集或完全匹配集的那些 为此,我正在做这样的事情
map.filter(validator_set__in=validators_list)
但这似乎不起作用,它似乎正在单独检查 validators_list 的每个元素,因此返回重复的结果和 即使整个 validator_set 不是 validator_list.
也会返回为了说明它的行为有点像这种方式
[1,2,3] 中的[a->1,2] 将给出 [a,a]
[2,3] 中的[a->1,2] 将给出 [a]
在第一种情况下,它应该返回 [a],而在第二种情况下,它应该返回任何内容或为空 我该怎么做?
这是完全自然的行为。您的查询在 ValidatorMetaData
上生成 JOIN
,在 returns 上为每对 (PermissionValidatorMap, ValidatorMetaData)
生成 PermissionValidatorMap
,其中 ValidatorMetaData
与查询匹配。这里的关键是 validator_set__in
查找发生在 ValidatorMetaData
table 中。
要获得所需的行为,您必须排除在 validator_list
中具有相关 ValidatorMetaData
not 的每个 PermissionValidatorMap
,即:
PermissionValidatorMap.objects.exclude(
validator_set__in=ValidatorMetaData.objects.exclude(id__in=validator_list))