Упорядочить набор запросов в django по аннотированному полю и добавить остальные объекты, которые не соответствуют критериям - PullRequest
0 голосов
/ 13 октября 2011

Так что этот фрагмент практически объясняет, что я хочу сделать

bloc_results = bloc_results.annotate(num_mates=Count(profilebloc__profile__in=probable_mates)).order_by("-num_mates")

Я знаю, что это невозможно, но это был самый простой способ объяснить ситуацию. переменная probable_mates - это список, заполненный персональными файлами пользовательской таблицы. Поэтому я должен получить этот номер и порядок по нему Это не проблема с использованием фильтра. Дело в том, что использование фильтра извлекает только те объекты, которые соответствуют идентификаторам из этого списка probable_mates, а не все объекты с наибольшим количеством совпадений вверху, что мне и нужно получить. Как я могу сделать это с Django ORM без использования необработанного SQL? Спасибо!

РЕДАКТИРОВАТЬ: Я немного поясню, объяснив, что это делает: Есть несколько клубов, которые будут добавлены в это веб-приложение, и мне нужно сортировать по двум различным параметрам. Один из них по количеству членов каждого клуба, что довольно просто. Второй - «Клубными друзьями», так что все клубы упорядочены по количеству общих друзей, которых они имеют с зарегистрированным пользователем, даже если этот пользователь не вступил в этот клуб. И это не так сложно. Проблема в том, что когда я получаю этот набор запросов и заказываю его, он отображает только те клубы, у которых есть общие друзья по клубу, а не остальные. Мне нужны те, у кого есть друзья по клубу наверху, заказанные по количеству общих друзей по клубу, а остальные внизу, даже если у них нет общих друзей по клубу.

Ответы [ 3 ]

0 голосов
/ 14 октября 2011

Я думаю, вам нужно подходить к этому с вашей profilebloc модели.Подсчитайте сопряжений с помощью этой модели, а затем отфильтруйте результаты, чтобы оставить только блоки профиля, которые есть в вашем bloc_results.Извините, без ваших моделей я не могу быть более ясным.

0 голосов
/ 16 октября 2011

Это был довольно плохо объясненный вопрос, но я решил его, используя |оператор для объединения обоих наборов запросов следующим образом:

new_queryset = one_queryset | second_queryset

В конце концов, не нужно было использовать списки.

0 голосов
/ 13 октября 2011

Как сказал Аконсу в своем комментарии, я не совсем уверен, чего вы пытаетесь достичь. Тем не менее, это звучит похоже на этот вопрос Я только что ответил. Адаптировано к названиям вашей модели, делает ли следующее то, что вы хотите?

matches = bloc_results.objects.filter(profilebloc__profile__in=probable_mates)
matches = matches.annotate(Count('num_mates'))
results = matches.order_by('-num_mates')

Если нет, думаю, вам нужно немного прояснить свой вопрос.

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