Django выполнить заказ до фильтра - PullRequest
0 голосов
/ 29 марта 2020

Я использую django 2.0.7, поэтому я хочу заказать набор запросов и затем выбрать отдельные записи, после этого я собираюсь выполнить некоторую фильтрацию, как вы можете видеть здесь, я делаю заказ и выберите разные вещи

forms = Form.objects.order_by('user','-created_at').distinct('user')

и здесь я фильтрую некоторые атрибуты

filterd_qs = forms.filter(**query)

проблема в том, что запрос order_by выполняется после запроса фильтра , что вызывает неожиданное Результаты (он применяет фильтр ко всему набору запросов), запрос sql был получен из последнего фильтра:

SELECT DISTINCT ON ("table"."user_id") fields FROM "appname_form" WHERE where_clause ORDER BY "appname_form"."user_id" ASC, "appname_form"."created_at" DESC;

, как мне заставить django orm обернуть запрос orderby запросом фильтра !! любое предложение подойдет

edit: ребята, я думаю, вы не поняли проблему, допустим, что у нас есть этот набор запросов

queryset = [
('john',"02-23-2020",type2),
('sarah',"02-03-2020",type1),
('joe',"01-11-2020",type2),
('john',"02-25-2020",type1),
('joe',"02-28-2020",type1)
]

, когда я впервые выполняю отдельный порядок запросить результат будет

queryset = [
('john',"02-25-2020",type1),
('sarah',"02-03-2020",type1),
('joe',"02-28-2020",type1)
]

, а затем, когда я выполню фильтр, например:

queryset = Form.objects.order_by('user','-created_at').distinct('user')
qs = queryset.filter(type=type2)

результат будет

queryset = [
('john',"02-23-2020",type2),
('joe',"01-11-2020",type2)
]

, хотя результат должен пустой набор запросов !!

1 Ответ

0 голосов
/ 30 марта 2020

Вы можете создать подзапрос, который содержит последние Form для пользователя, а затем отфильтровать по этому подзапросу, чтобы получить то, что вы хотите

forms = Form.objects.filter(
    id__in=Form.objects.order_by('user','-created_at').distinct('user').values('id')
).filter(**query)

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

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