По правде говоря, если все, что вам нужно, это общее количество записей в RawQuerySet, то во всех случаях вам следует избегать приведения RawQuerySet в список.
Приведение RawQuerySet в список будет повторять каждую запись, соответствующую запросу. Это потенциально обременительно для сервера. Вместо этого используйте количество (). Это может быть достигнуто путем оборачивания счетчика () вокруг необработанного SQL, который вы использовали для порождения RawQuerySet.
Я использовал это, чтобы решить проблему:
def add_len_protocol_to_raw_sql_query( query ):
"""
Adds/Overrides a dynamic implementation of the length protocol to the definition of RawQuerySet for the remainder of this thread's lifespan
"""
from django.db.models.query import RawQuerySet
def __len__( self ):
from django.db import connection
sql = 'SELECT COUNT(*) FROM (' + query + ') B;'
cursor = connection.cursor()
cursor.execute( sql )
row = cursor.fetchone()
return row[ 0 ]
setattr( RawQuerySet, '__len__', __len__ )
query = 'SELECT * FROM A_TABLE_OF_MINE'
add_len_protocol_to_raw_sql_query( query )
Это делает динамическое изменение в RawQuerySet, чтобы оно отвечало протоколу len ().
Это намного лучше с точки зрения производительности, у вас есть потенциал для одного недостатка: если вы используете RawQuerySet более одного раза, то было бы желательно отказаться от динамического _ len _ реализация.
Кто-нибудь из вас знает, будет ли метод _ len _ ограничен контекстом выполнения вызывающей стороны? Если вы используете MOD_WSGI в Apache, означает ли это, что все потоки в процессе вызывающей стороны будут использовать измененное определение?