我想检索用户或他/她的朋友创作的所有帖子:
目前,我使用Q对象:
# friends = QuerySet containing User objects
# user = User object
posts = Post.objects.filter(Q(author__in=friends) | Q(author=user))
它将生成一个如下所示的SQL查询:
SELECT ... WHERE ("posts_post"."author_id" IN (2, 3) OR "posts_post"."author_id" = 1)
问题:
是否可以将user
对象附加到friends
QuerySet来生成看起来像这样的查询,而不是:
SELECT ... WHERE "posts_post"."author_id" IN (2, 3, 1)
实际上,直接使用QuerySet的.append()方法确实可以:
friends.append(user)
posts = Post.objects.filter(author__in=friends)
但是,在这里和其他地方,我已经看到了许多答案,请注意不要将QuerySet视为基本列表。
后一种.append()
技术安全吗?它是否有效,特别是在QuerySet非常大的情况下?还是有另一种首选方法?或者,随时告诉我我很傻,并且Q对象方法没有错!
非常感谢。
查询集没有append
方法,因此,如果该方法在您的上下文中有效,friends
则它已经是列表而不是查询集。
至于性能-我的直觉是,查询集太大而无法放入内存,因此您可以追加到该查询集也将太大,以致于不能作为子查询。但是,与性能问题一样,测试是唯一可以确定的真正方法。
无论哪种方式,您都肯定会对性能造成影响。如果您不需要friends
其他任何内容,则可以使用查询集values_list
将PK仅存储到内存中,append user.id
,然后根据该PK列表进行过滤。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句