在哪种情况下,QuerySet将从数据库中取值

根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片操作的过程中,Django其实并没有去访问数据库。只有当你对QuerySet进行evaluate(还不知道翻译成什么合适,暂且这样)时,Django才会去访问数据库。


下面这几种方式,可以对QuerySet进行evaluate:


1.迭代操作
QuerySet是可迭代的,因为他如同一个list一样,储存着多条记录(每个记录就是一个Django中Model的实例)and it executes its database query the first time you iterate over it. For example, this will print the headline of all entries in the database:
for e in Entry.objects.all():
    print(e.headline)


2.切片操作
但是[:10] [1:10]这样的操作,Django不会去访问数据库,但是[1:10:2]这样的切片,也就是带有step的切片,Django会去访问数据库。
虽然对QuerySet进行[:10] [1:10]这样的操作后,Django没有访问数据库,但是,这样操作后得到的QuerySet,不能再进行filter或者order_by等再修改它的操作了。因为再进行其它的操作,Django将很难生成正确的sql语句,这样将出现问题。


4.repr()方法
调用此方法后,Django将访问数据库,QuerySet将被evaluated
如:repr(User.objects.all())


5.len()方法
同上,如果只是想知道QuerySet中有多少条记录,可以使用count()方法。User.objects.count()


6.list()方法
此方法将强制QuerySet被evaluation


7.bool(),or,and,if
如 if User.objects.filter(pk=1)
当需要判断QuerySet有没有记录时,QuerySet将被evaluate。bool()执行时,如果QuerySet中有记录,则返回True,否则返回False

你可能感兴趣的:(python)