сложный запрос в представлении Django из разных моделей - PullRequest
0 голосов
/ 13 августа 2011

У меня есть три модели, которые имеют некоторые общие, но не точные поля, из одного представления, напр.home Я получаю вот так

interviews = Interviews.objects.all().order_by('pub_date')[:3]
publications = Publications.objects.all().order_by('pub_date')[:3]
published = Published.objects.all().order_by('pub_date')[:3]

Из домашнего просмотра я хочу, чтобы они отображались в шаблоне в таком порядке, чтобы все последние / новые записи, связанные с этими моделями, были в топе.

например, если запись 10 интервью является самой последней записью во всех этих моделях, то она будет первой, затем, если опубликованная запись является второй последней, она будет второй ... и т. д. и т. д. * etc

Может кто-нибудь сказать мнекак это сделать?

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Один из возможных способов - использовать лямбду для сортировки данных, но затраты выше, поскольку вы будете делать это с python, а не с СУБД ...

lst = []
lst.extend(list(Interviews.objects.order_by('pub_date')[:10]))
lst.extend(list(Publications.objects.order_by('pub_date')[:10]))
lst.extend(list(Published.objects.order_by('pub_date')[:10]))
# take 10 records for each, since you could not know how many records will be picked from which table
# now order them...
lst.sort(lambda x, y: cmp(x.pub_date, y.pub_date))
# and reverse the order, so newset is the first...
lst.reverse()

это даст вам список упорядоченных объектов py pub_date , так что вы можете нарезать окончательный список, чтобы получить любое количество записей, которое вы хотите ...

lst = lst[:10]
0 голосов
/ 13 августа 2011

В зависимости от ваших других требований может быть хорошей идеей превратить их в подклассы общего суперкласса, содержащего общие элементы.

Трудно сказать, допустимо ли это, но если вы это сделаете, вы можете запросить различные типы объектов по отдельности или вместе, вызвав

SuperClass.objects.all().order_by('-pub_date')[:9]

, что сделает 9 первых объектов независимо от того, какой они подкласс. Конечно, если предположить, что суперкласс называется SuperClass. Конечно, это не гарантирует, что есть 3 каждой модели.

Еще один простой способ решить эту проблему - хотя, по общему признанию, не использовать запрос, просто сортировать списки.

entries = sorted(list(interviews) + list(publications) + list(published), key=lambda x: x.pub_date, reverse=True)

должно работать - в основном превращать их в списки и сортировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...