有什么办法可以将其转换为Django orm吗?

时间:2019-04-26 05:50:04

标签: django postgresql 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'))

DJANGO ORM在RAW SQL中的输出:

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"

RAW 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

1 个答案:

答案 0 :(得分:0)

如果要与之左连接,则无法在ApplicantInfo上进行查询。在SourceType上查询:

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

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