【问题标题】:Convert postgres raw query to Django ORM query and group by将 postgres 原始查询转换为 Django ORM 查询并分组
【发布时间】:2020-07-13 15:20:00
【问题描述】:

我有一个原始 Postgresql 查询需要转换为 Django ORM 查询。

我能够在 Postgres 中执行查询并看到预期的结果。我在 postgres DB 上获得了 5 条原始查询记录。

但是当我执行 Django ORM 查询时,它没有给出预期的输出。我在 postgres 中得到了 ORM 查询的 78 个结果。

请让我知道我在 Django ORM 查询中哪里出错了。

原始 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 是我将在原始查询集中提供实际值的地方。

编辑1:

这是我尝试打印 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 子句中,即使我没有指定它。

【问题讨论】:

    标签: python django postgresql django-models django-orm


    【解决方案1】:

    怎么样:

    
    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')
               )
    
    

    【讨论】:

    • 出于某种原因,我可以使用Sum() 而不是Count() 来实现它。
    猜你喜欢
    • 2022-08-18
    • 2019-06-11
    • 2019-12-10
    • 2015-08-23
    • 1970-01-01
    • 2016-10-23
    • 2016-06-04
    • 2016-04-20
    • 2018-05-15
    相关资源
    最近更新 更多