Упорядочить набор запросов в django по аннотированному полю и добавить остальные объекты, которые не соответствуют критериям

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

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

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

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

python,django,web,

0

Ответов: 3


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

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

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


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


0 принят

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

new_queryset = one_queryset | second_queryset

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

питон, Джанго, веб,
Похожие вопросы