On Thursday, December 27, 2012 12:35:16 AM UTC, ke1g wrote:
--On Wed, Dec 26, 2012 at 3:50 PM, Glyn Jackson <cfsp...@gmail.com> wrote:ke1g, thank you for such a well written reply, clearly explained, I learn a lot. again thanks.
The only bit I'm struggling to understand is the last part you state
"The use of "thisPoints" in calculating "totalPoints" doesn't change "thisPoints". You can still enumerate it in the template, and get the same result."
Manager and queryset methods like "filter" return a new queryset, which is a python class instance holding all the things that you have said about your query, but it hasn't touched the database as yet. When you use something like "filter" on an existing queryset, the original information is still in the original queryset, it has been copied as necessary in the construction of the new queryset.
A queryset is "evaluated" only when you try to use what's in the queryset, such as "list(qs)" or "for r in qs" (including the template language's "for"), or when you print it in the manage.py shell, as examples. And only when it is evaluated, does it wind up composing SQL, send it to the database, parse the result into model instances (and cacheing these as part of doing requests with large numbers of results in chunks, among other things). You really get quite a number of splendid optimizations when you use the ORM.
So at the time I showed applying "aggregate" to the "thisPoints" queryset, "thisPoints" hadn't touched the database. At that time, it is specifically NOT a list of instances. It is still a queryset class instance. And the "aggregate" method uses what's in it, but doesn't change it. Later, in your template, where you presumably apply a "for" template tag to it, is when it uses what it knows to get stuff for you from the database.
Bill
You received this message because you are subscribed to the Google Groups "Django users" group.
To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/Eo93nblTwTkJ.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
No comments:
Post a Comment