【问题标题】:Unable to check if queryset is a subset无法检查查询集是否是子集
【发布时间】:2015-03-20 05:06:12
【问题描述】:

我有三个模型

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"),)

现在我正在做的是获取来源、许可证、许可和验证器列表(这是一个列表)并使用它们过滤 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] 而在第二种情况下什么也没有或为空 我该怎么做?

【问题讨论】:

    标签: django python-3.x django-models django-queryset django-1.7


    【解决方案1】:

    这是完全自然的行为。您的查询在ValidatorMetaData 上生成JOIN,并为每对(PermissionValidatorMap, ValidatorMetaData) 返回PermissionValidatorMap,其中ValidatorMetaData 与查询匹配。这里的关键是validator_set__in 查找发生在ValidatorMetaData 表中。

    要获得所需的行为,您必须排除在validator_list 中具有相关ValidatorMetaData not 的每个PermissionValidatorMap,即:

    PermissionValidatorMap.objects.exclude(
        validator_set__in=ValidatorMetaData.objects.exclude(id__in=validator_list))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2022-01-04
      • 2020-08-27
      相关资源
      最近更新 更多