python - django Queryset became List after a for loop -


i'm using django website ,the problem hard tell,please see code below.(python 2.7.10)

in [1]: user = user.objects.filter(pk__gt = 1) in [2]: type(user) out[2]: django.db.models.query.queryset  in [3]: user1=user[0:user.count()] in [4]: type(user1) out[4]: django.db.models.query.queryset 

obviously ,user , user1 queryset, problem come:

in [1]: user = user.objects.filter(pk__gt = 1) in [2]: type(user) out[2]: django.db.models.query.queryset  in [3]: in user:pass in [4]: user1=user[0:user.count()] in [5]: type(user1) out[5]: list 

the user queryset,but user1 became list.

the diffirent betweet these 2 code loop

 in user:pass 

i confused happend in loop ?

by running for loop django calls evaluating queryset. before that, said lazy, means adding filters , other queryset methods not hit database.

an interesting snippet querysets lazy (also see example there):

querysets lazy – act of creating queryset doesn’t involve database activity. can stack filters day long, , django won’t run query until queryset evaluated.

there few statements , methods evaluate queryset, documented in when querysets evaluated , include iteration , slicing evaluated queryset.

what means once evaluate queryset, e.g. through iteration did for loop, django query database. once done paragraph docs sums behavior after slicing queryset user1=user[0:user.count()] on in [4] in second shell snippet.

slicing. explained in limiting querysets, queryset can sliced, using python’s array-slicing syntax. slicing unevaluated queryset returns unevaluated queryset, django execute database query if use “step” parameter of slice syntax, , return list. slicing queryset has been evaluated returns list.


Comments