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”