2017-02-10 60 views
2

我已经搜索周围,但还没有找到像我这样的情况。假设使用Django的User Profile方法来扩展默认用户功能,多对象查询集将如何映射到相关对象的查询集。Django QuerySet选择相关对象

例如(在模型中):

class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 

    friends = models.ManyToManyField("self", symmetrical=True, blank=True) 

和视图里面:

class Friends(generics.ListAPIView): 

    queryset=User.objects.all() 
    serializer_class = UserSerializer 

    def get_queryset(self): 
     user = self.request.user 
     profile = user.userprofile 
     profiles = profile.friends.all() 
     return profiles #We want this to be a queryset of users 

我曾尝试以下,但这只适用于如果profiles的大小为1。

return User.objects.filter(userprofile=profiles) 

回答

2
return User.objects.filter(userprofile__in=profiles) 
+0

只是好奇,如果我们有ñ的UserProfiles和M个用户这会是一个O(M * N)操作或不Django的不知何故知道它优化到O(N)操作? – meritus

+0

这条语句将被翻译成一个单一的sql语句,看起来像这样 'select * from users where id in(select user_id from profiles where .....)' 所以复杂度不会增加并且接近O(N)还是O(N * 2)?我不是专家,但肯定不是O(M * N) – Ramast

+0

第二个想法是,复杂性可能会更高(在数据库层面)。要知道确切的复杂性,您需要了解db引擎如何执行子查询以及如何利用列索引。所有这些都不在我所知道的范围内 – Ramast