Преобразовать postgres необработанный запрос в Django запрос ORM и сгруппировать по - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть необработанный запрос Postgresql, который необходимо преобразовать в Django запрос ORM.

Мне удалось выполнить запрос в Postgres и увидеть ожидаемый результат. Я получаю 5 записей для необработанного запроса в postgres DB.

Но когда я выполняю запрос Django ORM, он не дает ожидаемого результата. Я получаю 78 результатов для запроса ORM в postgres.

Пожалуйста, дайте мне знать, где я делаю ошибку в Django запросе ORM.

Raw postgres запрос:

select customer_id, program_id, project_id, store_id, count(store_id) 
from public.alerts_alert where (customer_id=2 and program_id=134 and project_id=1364) 
group by customer_id, program_id, project_id, store_id 

Django Запрос ORM:

queryset = Alert.objects.filter(**filter_params).annotate(
            customer_name=F('customer__name'),
            program_name=F('program__name'),
            project_name=F('project__name'),
            store_count=Count('store')
        )

**filter_params, где я буду предоставлять фактические значения, как указано в raw queryset.

Edit1:

Это то, что я получаю, когда пытаюсь напечатать queryset.query.

SELECT "alerts_alert"."time_created", "alerts_alert"."time_modified", "alerts_alert"."registered_timestamp", "alerts_alert"."id", "alerts_alert"."title", "alerts_alert"."content", "alerts_alert"."alert_date", "alerts_alert"."expiration_date", "alerts_alert"."current_status_id", "alerts_alert"."customer_id", "alerts_alert"."store_id", "alerts_alert"."program_id", "alerts_alert"."project_id", "alerts_alert"."visit_id", "alerts_alert"."batch_id", COUNT("alerts_alert"."store_id") AS "store_count", "programs_program"."name" AS "program_name", "projects_project"."name" AS "project_name", "customers_account"."name" AS "customer_name" FROM "alerts_alert" INNER JOIN "projects_project" ON ("alerts_alert"."project_id" = "projects_project"."id") INNER JOIN "customers_account" ON ("alerts_alert"."customer_id" = "customers_account"."id") INNER JOIN "programs_program" ON ("alerts_alert"."program_id" = "programs_program"."id") WHERE ("alerts_alert"."expiration_date" IS NULL AND "alerts_alert"."project_id" = 1364 AND "alerts_alert"."customer_id" = 2 AND "alerts_alert"."program_id" = 134 AND "alerts_alert"."unregistered_timestamp" IS NULL) GROUP BY "alerts_alert"."id", "programs_program"."name", "projects_project"."name", "customers_account"."name"

Надеюсь Не знаю почему, но по какой-то причине набор запросов django добавляет столбец id к предложению group by, хотя я его не указывал.

1 Ответ

0 голосов
/ 02 апреля 2020

А как же:


queryset = Alert.objects.filter(**filter_params).values(
            'customer_id', 
            'program_id', 
            'project_id', 
            'store_id').annotate(
              customer_name=F('customer__name'),
              program_name=F('program__name'),
              project_name=F('project__name'),
              store_count=Count('store')
           )

...