对不起,如果这个问题听起来很奇怪。我只是想知道,如果我已经有了一个queryset,是否有可能创建新的queryset。
例如这里。。。
everyone = User.objects.filter(is_active=True) # this would of course return all users that's active
not_deleted = User.objects.filter(is_active=True, is_deleted=False) # return user that's active and not deleted
is_deleted = User.objects.filter(is_active=True, is_deleted=True) # return user that's active and is already deleted
我的问题是…对于not_deleted
和is_deleted
它们都是活动的是真的,与everyone
一样,是否有可能使用everyone
然后以某种方式过滤掉is_deleted=True
或is_deleted=False
?所以我相信如果这可能的话,查询会更快更好,对吧?
所有这三个变量everyone
、not_deleted
和is_deleted
都将用于其他用途。
希望我把问题说清楚了。
提前谢谢。
是的,您可以重用现有的查询集。
这实际上并没有提高任何速度,但事实上,这个代码块甚至不会对数据库执行查询,因为Django QuerySets的计算很懒。我的意思是,在您真正需要这些值之前,它不会将查询发送到数据库。下面是一个与数据库对话的示例。
推荐阅读:
作为这个答案的补充,如果您真的需要,可以进行一个查询,然后用Python进行过滤。请注意,不能对列表进行后续筛选,因为它们不是queryset。
在最后一个示例中,
everyone
是一个queryset,而active_not_deleted
和active_is_deleted
是用户对象的Python列表。在第一个list(everyone)
调用中,只对everyone
queryset求值一次,然后缓存结果。你能做的就是:
如果我理解正确的话,你的问题的答案可能是肯定的。
一。链过滤法
@Cory Madden已经回答了。
User.objects.filter(active=True)
返回Queryset。所以你可以添加过滤方法。active_users.filter(is_deleted=False)
2。使用Q方法
更容易管理复杂的查询集。如果你想过滤用户id不是3怎么办?您可以使用Q simpley like
User.objects.filter(Q(active=True) & ~Q(id = 3))
回答你的意见
不管是否使用Q,它都有相同的原始查询。
数据库性能与您访问数据库以提取数据的频率有关,或者在按FK关系提取数据时使用诸如“Join”之类的重载方法。所以使用Q或不使用Q并不会带来性能差异,因为它有相同的查询语句。
另外
不会给你带来性能差异。
奎丽斯特很懒。
user
和not_deleted
变量只有queryset字符串。当您像上面这样定义变量时,它不会立即到达数据库。不管怎样,每个变量都会命中三次。相关问题 更多 >
编程相关推荐