Django количество подобъектов с ntext на SQL сервере - PullRequest
0 голосов
/ 30 марта 2020

У меня есть Claim объект с ClaimAttachment с простым внешним ключом.

Я хочу отфильтровать утверждения, которые имеют более x вложений. Обычно я бы просто сделал: Claim.objects.annotate (att_count = Count ("attachments")). Filter (att_count__gt = 5)

Легко. За исключением того, что в Claim есть несколько полей ntext, и это приводит к:

django.db.utils.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator. (306) (SQLExecDirectW)')

Это потому, что Django создает внешнее соединение между Claim и ClaimAttachment и группирует по всем полям из Claim. Некоторые из этих полей являются ntext, их нельзя сгруппировать.

Я попытался обойти проблему, выполнив подзапрос самостоятельно:

att = ClaimAttachment.objects.filter(claim_id=OuterRef("id")).aggregate(count=Count("id"))
Claim.objects.annotate(att_count=Subquery(att)).filter(att_count__gt=5)

Но агрегирование не может быть выполнено для запрос OutRef. Я могу переместить счетчик на annotate(att_count=Count(Subquery(att))), но я вернулся на круги своя, потому что он пытается снова сгруппировать по всем полям.

Я знаю, что это на самом деле не ошибка Django, а скорее другая SQL Сервер раздражает, но я не контролирую эту модель данных, не говоря уже о настройке сервера базы данных. Как я могу обойти это ограничение и получить количество вложений?

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