Могу ли я выполнить запросы в Django, где функции LHS и RHS являются функцией? - PullRequest
1 голос
/ 09 марта 2020

Я бы хотел выполнить запросы в Django, где и левая, и правая стороны являются функцией. Я пытаюсь реализовать некоторую сложную обработку запросов (написание WFS-сервера), где могут происходить подобные ситуации:

SELECT * FROM table WHERE LCASE('LiteralValue') = LOWER(field2)

Возможно ли это с помощью QuerySet.filter(..) или * 1007? * API объектов? Он всегда ожидает, что выражение начинается с поля.

1 Ответ

2 голосов
/ 09 марта 2020

Да, вы можете аннотировать объекты модели по одной из сторон, а затем фильтровать по другой стороне:

from django.db.models.functions import Lower

QuerySet.objets.annotate(
    <b>field1_lower=Lower('field1')</b>
).filter(
    <b>field1_lower=Lower('field2')</b>
)

Для сопоставления без учета регистра следует использовать __iexact lookup [Django -doc] :

from django.db.models import F

QuerySet.objets.filter(
    <b>field1__iexact=F('field2')</b>
)

Обратите внимание, что сопоставление без учета регистра не то же, что вызов Lower on два операнда, а затем проверьте, совпадают ли два. Действительно, сопоставление определяет определенные c правила для обработки специальных символов. Например, на немецком языке ß не имеет строчной версии. Есть специальные правила, как их сравнивать.

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