I have submitted a ticket: https://code.djangoproject.com/ticket/28233
在 2017年2月9日星期四 UTC+8上午7:24:24,Tim Graham写道: > > Please submit a pull request to fix the documentation if you can. > > There's an open ticket for a way to get the SQL for a terminal queryset > method: https://code.djangoproject.com/ticket/18631 > > On Wednesday, February 8, 2017 at 5:09:25 PM UTC-5, Viktor Bale wrote: >> >> Ok, you spurred me on to actually try it out. And the answer is >> interpretation (i) is correct. Which means the example in the cheat sheet >> is somewhat misleading, since it does't calculate price per page, rather >> the sum of prices per page for individual books. >> >> BTW, while playing with that little conundrum, I couldn't work out how to >> display in the shell the SQL query the aggregate() function will execute >> before actually executing it. You can find it after the act using "from >> django.db import connection; print(connection.queries)". And printing >> str(queryset.query) doesn't work like for annotate(), since aggregate() is >> terminal and returns a dict (unlike annotate() which returns another >> queryset). Any ideas? >> >> >> >> On Wednesday, 8 February 2017 20:10:59 UTC+1, Tim Graham wrote: >>> >>> As for me, this statement from that page applies, "It’s difficult to >>> intuit how the ORM will translate complex querysets into SQL queries so >>> when in doubt, inspect the SQL with str(queryset.query) and write >>> plenty of tests." >>> >>> I'm not good at figuring out at a glance what an aggregation query will >>> do. Do some experimentation and you should be able to figure it out >>> yourself. >>> >>> On Wednesday, February 8, 2017 at 12:41:24 PM UTC-5, Viktor Bale wrote: >>>> >>>> Hi all >>>> No takers, eh? Does this means it also confuses other more experienced >>>> people, or that it's a silly question? If the aggration function was Avg >>>> instead of Sum, then it would make perfect sense (the average price per >>>> page over all books)... but it doesn't, so it doesn't :-) >>>> Thanks >>>> >>>> >>>> On Monday, 6 February 2017 13:24:49 UTC+1, Viktor Bale wrote: >>>>> >>>>> This is confusing me. >>>>> >>>>> In the topic guide on Aggregation ( >>>>> https://docs.djangoproject.com/en/1.10/topics/db/aggregation/#cheat-sheet), >>>>> >>>>> there is an example in the cheat sheet as follows: >>>>> >>>>> # Cost per page>>> from django.db.models import F, FloatField, Sum>>> >>>>> Book.objects.all().aggregate(... >>>>> price_per_page=Sum(F('price')/F('pages'), >>>>> output_field=FloatField())){'price_per_page': 0.4470664529184653} >>>>> >>>>> >>>>> Does this mean: >>>>> i) Calculate the price per page for each book (F('price')/F('pages')) >>>>> and then aggregate these over all books using the Sum function, or >>>>> ii) Aggregate the price using the Sum function, and also the number of >>>>> pages using the Sum function, and them divide the former by the latter. >>>>> ? >>>>> >>>>> Interpretation (i) is what the statement seems to say but this will >>>>> result in a fairly meaningless number (the sum of cost per page per book, >>>>> which is dependant on the number of books and doesn't mean much, and is >>>>> certainly not an average price per page or anything similar). >>>>> >>>>> Interpretation (ii) would make more sense (it calculates the overall >>>>> price per page over all books), but the fact that the expression >>>>> (F('price')/F('pages')) is inside the Sum function suggests that this is >>>>> not what is happening. >>>>> >>>>> Additionally, to aid my understanding, depending on which >>>>> interpretation is correct, what would the statement be to implement the >>>>> other interpretation? e.g. is interpretation (i) is what the above >>>>> statement is doing, how would interpretation (ii) be implmented? Or vice >>>>> versa.... >>>>> >>>>> Thanks >>>>> >>>>> -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/51b89af0-0968-453d-a4d6-c9a1e923892a%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

