2014-01-22 7 views
0

Я хочу объединить два QuerySet получены из двух разных моделей, и я могу сделать это с помощью itertools, как это:Concatenate QuerySet в Джанго

ci = ContributorImage.objects.all() 
pf = Portfolio.objects.all() 
cpf = itertools.chain(ci,pf) 

Но реальное исправление Разбиение results.If я передать итератор (CPF или наш сцепляются QuerySet) в Paginator функции, p = Paginator(cpf, 10), она работает хорошо, но не на получение первой страницы page1 = p.page(1) с ошибкой, которая говорит:

TypeError: object of type 'itertools.chain' has no len()

Что я могу сделать в подобном случае?

+0

Я знаю, если я оцениваю ci pf, разбивая их в списке(), это решит мою цель, но я думаю, что это надует память и будет неэффективны, исправьте меня, если я ошибаюсь. –

ответ

1

itertools.chain()will return a generator. Paginator class нужен объект, реализующий __len__ (генераторы, конечно не поддерживать его, так как размер коллекции неизвестен).

Ваша проблема может быть решена несколькими способами (в том числе с использованием list для оценки генератора, как вы говорите), однако я рекомендую взглянуть на QuerySetChain, упомянутые в этом ответе:

https://stackoverflow.com/a/432666/119071

I думаю, что это соответствует вашей проблеме. Также взгляните на комментарии этого ответа - они действительно просвещаются :)

+0

Использование list() для оценки генератора - это аккуратное решение, работающее для меня в подобном случае, спасибо. – Rickka

Смежные вопросы