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
Post a Comment