-
articles = Article.objects.filter(tags__in=[tag.id for tag in tags]).defer('content')
Стоит добавить счётчик:articles = Article.objects.filter(tags__in=[tag.id for tag in tags]).defer('content').annotate(tags_count=Count('tags'))
как получаю ошибку:IndexError at /articles/test/
tuple index out of range
Exception Type: IndexError
Exception Value:
tuple index out of range
Exception Location: Z:\usr\local\python\Lib\site-packages\django\db\models\query.py in iterator, line 227
————————————————————————
Z:\usr\local\python\Lib\site-packages\django\db\models\query.py in iterator
220. obj = self.model(*row[index_start:aggregate_start])
221.
222. for i, k in enumerate(extra_select):
223. setattr(obj, k, row[i])
224.
225. # Add the aggregates to the model
226. for i, aggregate in enumerate(aggregate_select):
227. setattr(obj, aggregate, row[i+aggregate_start]) ...
228.
229. yield obj
230.
231. def aggregate(self, *args, **kwargs):
232. """
233. Returns a dictionary containing the calculations (aggregation)
То же, если использовать «.only()».
Поискал информацию об ошибках «.defer»() или «.only()» совместно с «.annotate()» — не обнаружил вообще ничего.
Сталкивался ли кто-нибудь?
Нужна, лишь, пара полей для построения списка, не хочется тягать лишнее. -
А если местами поменять defer и annotate? Не поможет?
-
Нет, порядок на ошибку не влияет.
-
У меня применение
.defer()напару с.select_related()давало какой-то странный результат, что запрос выполнялся верный, но данные как-то шли не в те поля модели. До выяснения достаточного числа деталей и составления тесткейса, чтобы можно было выкатить багрепорт, увы, дело не дошло...Делаю на транке где-то двухнедельной давности
TorrentUser.objects.filter(user=request.user).\select_related('torrent').order_by('torrent__name').defer('torrent__torrent_data')и у меня значения полей в TorrentUser.torrent.* становятся полной чепухой. Убираюdefer— все тут же нормализуется. Возможно это тот же баг, что-то с порядком-числом полей не то и у defer сейчас какие-то проблемы.Или это у меня кривые руки...
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

