Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django,列表上的exclude()函数_Python_Django_List_Django Queryset - Fatal编程技术网

Python Django,列表上的exclude()函数

Python Django,列表上的exclude()函数,python,django,list,django-queryset,Python,Django,List,Django Queryset,我有一个列表,我想从中删除包含在另一个列表中的所有元素 因此,我希望有类似于“排除”的查询集,但在列表中 这是我的代码: list = Friend.objects.friends(self.request.user) i_am_blocking = User.objects.filter(blocks_received__user_blocking=self.request.user) is_blocking_me = User.objects.filter(blocks_set__user_

我有一个列表,我想从中删除包含在另一个列表中的所有元素

因此,我希望有类似于“
排除
”的查询集,但在列表中

这是我的代码:

list = Friend.objects.friends(self.request.user)
i_am_blocking = User.objects.filter(blocks_received__user_blocking=self.request.user)
is_blocking_me = User.objects.filter(blocks_set__user_blocked=self.request.user)
            blocked_users = list(chain(i_am_blocking, is_blocking_me))
现在我想从“
列表”
”中删除包含在“
阻止的用户”
”中的所有项目


有更好的方法吗?

您可以使用列表理解:

list = [friend for friend in list if friend.user not in blocked_users]
更新:要在ORM级别执行相同的操作,可以使用如下查询:

list = Friend.objects.friends(self.request.user) \
                     .exclude(user__in=blocked_users)

您可以使用以下列表:

list = [friend for friend in list if friend.user not in blocked_users]
更新:要在ORM级别执行相同的操作,可以使用如下查询:

list = Friend.objects.friends(self.request.user) \
                     .exclude(user__in=blocked_users)

略为优化的版本:

friend_list = Friend.objects.friends(self.request.user)
i_am_blocking = User.objects.filter(...).values_list('pk', flat=True)
is_blocking_me = User.objects.filter(...).values_list('pk', flat=True)
blocked_users = set(chain(i_am_blocking, is_blocking_me))

friend_list = [friend for friend in friend_list if friend.user_id not in blocked_users]
这有两个主要优点。首先,
blocked_users
是一个
集合
,因此
user not in blocked_users
不必遍历所有被阻止的用户来确定条件是否为真。其次,通过获取
pk
的列表,并与
friend.user\u id
进行比较,可以避免对每个可能的朋友进行额外的查询:
user\u id
friend
上的本地字段,而
user
是从数据库获取整个
user
对象的访问器


最有效的方法仍然是在ORM级别进行过滤。顺便说一句,请不要将任何内容分配给
列表
。它隐藏了内置的
list()
类型,如果需要,您可以使用
list
,但通常最好使用更具描述性的名称

稍微优化一点的版本:

friend_list = Friend.objects.friends(self.request.user)
i_am_blocking = User.objects.filter(...).values_list('pk', flat=True)
is_blocking_me = User.objects.filter(...).values_list('pk', flat=True)
blocked_users = set(chain(i_am_blocking, is_blocking_me))

friend_list = [friend for friend in friend_list if friend.user_id not in blocked_users]
这有两个主要优点。首先,
blocked_users
是一个
集合
,因此
user not in blocked_users
不必遍历所有被阻止的用户来确定条件是否为真。其次,通过获取
pk
的列表,并与
friend.user\u id
进行比较,可以避免对每个可能的朋友进行额外的查询:
user\u id
friend
上的本地字段,而
user
是从数据库获取整个
user
对象的访问器


最有效的方法仍然是在ORM级别进行过滤。顺便说一句,请不要将任何内容分配给
列表
。它隐藏了内置的
list()
类型,如果需要,您可以使用
list
,但通常最好使用更具描述性的名称

好的,这个很好用。你认为这是一个很好的方法吗?你能看到任何改进吗?这取决于Firend和阻止用户的数量。你应该自己测试一下。我在答案中添加了另一种基于ORM的解决方案。它可能比在python中操作数据更有效。感谢您的更新。无法使用。排除,因为Friend.objects.friends(self.request.user)返回的是“列表”,而不是查询集。所以,我会得到一个类似这样的错误:“list”对象没有“exclude”属性好的,这很好。你认为这是一个很好的方法吗?你能看到任何改进吗?这取决于Firend和阻止用户的数量。你应该自己测试一下。我在答案中添加了另一种基于ORM的解决方案。它可能比在python中操作数据更有效。感谢您的更新。无法使用。排除,因为Friend.objects.friends(self.request.user)返回的是“列表”,而不是查询集。因此,我将得到如下错误:“list”对象没有属性“exclude”