Функция sizeof
возвращает количество байтов, которое используется вашим массивом в памяти. Если вы хотите вычислить количество элементов в вашем массиве, вы должны разделить это число на тип переменной sizeof
массива. Скажем, int array[10];
, если целочисленное целое число переменной на вашем компьютере равно 32 бит (или 4 байта), чтобы получить размер вашего массива, вы должны сделать следующее:
int array[10];
int sizeOfArray = sizeof(array)/sizeof(int);
Я уже сталкивался с этим раньше и решил это с помощью extra
более или менее примерно так:
# annotate whether you've already voted on this item
table = Vote._meta.db_table
select = 'SELECT COUNT(id) FROM %s' %table
where1 = 'WHERE ' + table + '.user_id = %s'
where2 = 'AND ' + table + '.item_id = appname_item.id'
items = items.extra(
select={'votes':" ".join((select, where1, where2,))},
select_params=(request.user.id,)
)
Фактически, это принимает QuerySet элементов и аннотирует каждый из них либо 0, либо некоторым количеством голосов. . В моей системе я использую unique_topting = ('link', 'user')
для голосования, чтобы каждый пользователь мог проголосовать только один раз, поэтому аннотированные данные равны 0 или 1 (фактически логическое значение). Он работает достаточно хорошо и позволяет избежать проблемы n + 1.