从 django 中的 User.objects.all() 查询集中排除用户的朋友列表
Posted
技术标签:
【中文标题】从 django 中的 User.objects.all() 查询集中排除用户的朋友列表【英文标题】:Excluding a list of a user's friends from the User.objects.all() queryset in django 【发布时间】:2018-01-04 22:58:02 【问题描述】:在我的一个观点中,我重写了 get_queryset(self) 方法,以返回一个用户列表,其中不包括发出请求的用户的朋友和同一用户。这是我的代码的样子:
def get_queryset(self):
all_users = User.objects.all()
user_friends = Friend.objects.friends(self.request.user)
# Filter all_users to exclude all elements of the user_friends queryset.
# Filter all_users to exclude the current user making the request.
# Return the filtered queryset.
我正在使用django-friendship 库来处理好友请求和用户成为好友。在getting data about friendship section 中,它表示要获取用户所有朋友的列表,只需Friend.objects.friends(request.user)
。我不确定这是否会返回 Friend 实例或 User 实例的列表。 Friend 模型的源代码是here。在任何一种情况下,我将如何过滤查询集 all_users
以排除列表 user_friends
的所有元素。
【问题讨论】:
Friend
s 具有 to_user
和 from_user
属性。当你说你要过滤all_users
QuerySet
时,是应该基于to_user
还是from_user
中的user_friends
值?
应该基于赋予用户好友的属性。那不是 to_user 吗?
【参考方案1】:
看起来图书馆强制要求友谊是互惠的,因此您应该能够仅使用 User.objects.exclude(friends__from_user=self.request.user)
排除用户的朋友。或者all_user.exclude(friends__from_user=self.request.user)
,如果你愿意的话。
要同时排除用户,请添加.exclude(id=self.request.user.id)
。不管是在好友排除通话之前还是之后。
Friend.objects.friends(request.user)
返回一个用户列表,您可以通过检查其来源看到:
https://github.com/revsys/django-friendship/blob/ef711250a85b8d2d59af8bb7b61d088d3aea57e8/friendship/models.py#L154
friends = [u.from_user for u in qs]
行从 Friend
实例的查询集转换为用户列表。
【讨论】:
User 实例是否有friends 属性?我实现了一个自定义用户模型。 通过应用 User.objects.exclude(friends=self.request.user) 这将排除所有用户的朋友和同一个用户吗? 当我应用更改并调用以测试用户身份使用用户名登录的视图:“regis@gmail.com”时,我收到以下错误:ValueError:无法查询“regis@gmail.com” ": 必须是 "Friend" 实例。 哦,对了。抱歉,已更新以遵循排除中的 FK 关系。 不管应用最新的建议更改,我仍然收到内部服务器错误(julius@gmail.com 是当前用户用户名):ValueError:无法查询“julius@gmail.com”:必须是“朋友”的例子。 [29/Jul/2017 06:06:25]“GET /users/search/?search=regis HTTP/1.1”500 17711【参考方案2】:users = UserRoleAccount.objects.filter(groups__in = ura_groups).distinct().exclude(id=ura.id)
【讨论】:
以上是关于从 django 中的 User.objects.all() 查询集中排除用户的朋友列表的主要内容,如果未能解决你的问题,请参考以下文章
django 中 User.objects.create_user() vs User.objects.create() vs User().save() 的区别