首页 > 解决方案 > 有没有办法把它转换成 django orm?

问题描述

table1即使它不存在,我也需要获取所有行table2并将其显示为零。我得到了它,raw sql query但在django ORM中,我得到的值仅存在于table2. 我的 django orm的唯一区别是我使用的是内连接,而在原始 sql 查询中我使用的是左连接。有什么方法可以实现这一点,还是我应该使用原始 sql 查询?谢谢。

Django ORM:

total=ApplicantInfo.objects.select_related('source_type').values('source_type__source_type').annotate(total_count=Count('source_type'))

原始 SQL 中 DJANGO ORM 的输出:

SELECT "applicant_sourcetype"."source_type", COUNT("applicant_applicantinfo"."source_type_id") AS "total_count" FROM "applicant_applicantinfo" INNER JOIN "applicant_sourcetype" ON ("applicant_applicantinfo"."source_type_id" = "applicant_sourcetype"."id") GROUP BY "applicant_sourcetype"."source_type"

原始 SQL:

SELECT source.source_type, count(info.source_type_id) as total_counts from applicant_sourcetype as source LEFT JOIN applicant_applicantinfo as info ON source.id = info.source_type_id GROUP BY source.id

标签: djangopostgresqlorm

解决方案


您无法查询ApplicantInfo是否要与它进行左连接。SourceType改为查询:

qs = (SourceType.objects
    .values('source_type')
    .annotate(cnt=Count('applicantinfo'))
    .values('source_type', 'cnt')
)

由于您尚未发布模型,因此您可能需要调整字段名称以使其正常工作。


推荐阅读