Есть ли способ преобразовать это в Django Orm? - PullRequest
1 голос
/ 26 апреля 2019

Мне нужно было получить все строки в table1, даже если он не существует в table2, и отобразить его как ноль.Я получил его, используя raw sql query, но в django ORM я получаю значения, существующие только в table2.Единственное отличие в моей django-форме состоит в том, что я использую внутреннее соединение, в то время как в необработанном 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 голосов
/ 26 апреля 2019

Вы не можете запросить на ApplicantInfo, если хотите с ним присоединиться слева.Вместо этого выполните запрос SourceType:

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

Поскольку вы еще не опубликовали модели, вам может потребоваться изменить имена полей, чтобы они работали.

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