".count" in template does not work for "raw" queries

744 views
Skip to first unread message

bikeridercz

unread,
Mar 10, 2014, 7:21:27 AM3/10/14
to django...@googlegroups.com
Dear colleagues,

please help, it seem that count method used in template does not work for collections of records populated in views via direct "raw" query.

Example in view:
recordset = ASSETS.objects.raw('select s.col1, s.col2 from table s where s.col3 = to_char(%s)', [xxx])

Example in template:
{% with total=recordset.count %}
<p class="float-right">{{ total|default:"0" }} record{{ total|pluralize }} found</p>
{% endwith %}
 
Select returns approx. 20 rows, they are successfully populated into "recordset", they are iterable, can be accessed and displayed with no problem.

However "recordset.count" returns nothing.

In case that the recordset is populated in standard way through ASSETS.object.filter, the "count" method works fine. Unfortunately, "objets.filter" can not be used in this case.

Thanks for help.


C. Kirby

unread,
Mar 10, 2014, 1:19:14 PM3/10/14
to django...@googlegroups.com
The reason .count() doesn't work there is because count() runs a select count(*) query, but that can't run correctly with .raw().
The way to get the count is to cast the Resulting RawQuerySet to a list and run len() on it. This will result in the RawQuerySet getting evaluated however.

Alternatively, you could run the query twice using a django.db.connection object to run 'select count(*) from table s where s.col3 = to_char(%s)', [xxx] to get the count.

http://stackoverflow.com/questions/3037273/get-number-of-results-from-djangos-raw-query-function
http://stackoverflow.com/questions/2317452/django-count-rawqueryset
Reply all
Reply to author
Forward
0 new messages