Django独占过滤

2024-04-24 19:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如果查询在列表中,以下是用于筛选的Django:

options = [1,2,3]
result = Example.objects.filter('something__property__in'=options)

所以这里somethingForeignKey关系(有多个关系)到{}

我希望result是所有的Examples,它们的something为1、2和3。上面的示例代码是1、2或3。这是独家的!在

示例

以下内容将不属于result

^{pr2}$

以下是result

examples = Example.objects.all()
things = examples[0].something.all()
for thing in things: print thing.property
#1
#2
#8
#9
#3

作为第二个示例的原因是包含options中的所有内容,其中第一个示例有1和2,但不是3!在

在Django有没有一种简单的方法可以做到这一点?

我唯一能做的就是用上面给出的例子进行过滤,获取列表中的所有properties。并将该列表与以下python函数中的options进行比较:

def exclusive_in(list1,list2):
    count = 0
    for i in list1:
        if i in list2:
            count += 1
    if count == len(list2):
        return True
    else:
        return False

我觉得Django可以在对数据库的查询中做到这一点,这样效率会更高。有什么想法吗?在

注:

这必须适用于options中任意数量的项目,它可以是大于2的任何数字,甚至是10或100(虽然100不太可能,但仍然有可能)

还要注意,options将由字符串填充


Tags: djangoin示例列表objects关系examplecount
1条回答
网友
1楼 · 发布于 2024-04-24 19:28:15

我知道的唯一方法是使用extra方法传入查询某些自定义条件。在

Djangowon't allow you要用tables参数传递这个条件,那么它必须在where中。请使用django.contrib.auth models(示例中的Admin组拥有所有权限)查看以下示例:

>>> from django.contrib.auth import models
>>> permissions_id = [1,2]
>>> where = """(select count(1)
...               from auth_group_permissions gp
...              where gp.permission_id in ({})
...                and gp.group_id = auth_group.id) = {}"""    
>>> where = where.format(','.join(map(str, permissions_id)), 
...                      str(len(permissions_id )))
>>> models.Group.objects.extra(where=[where]).all()
[<Group: Admin>]
>>> print models.Group.objects.extra(where=[where]).all().query
SELECT `auth_group`.`id`, `auth_group`.`name` 
  FROM `auth_group` WHERE (select count(1)
                      from auth_group_permissions gp
                     where gp.permission_id in (1,2)
                       and gp.group_id = auth_group.id) = 2

相关问题 更多 >