Получить объекты, в которых строчные / пробельные имена равны строчным / пустым параметрам в фильтре Django - PullRequest
0 голосов
/ 13 апреля 2019

Я хотел бы получить все products, где версия без пробелов / строчных букв поля name равна версии без пробелов / строчных букв параметра input_product_name в Django.Как я могу это сделать?

Псевдокод

def get_or_add_product(input_product_name):
    return Product.objects.filter(where no-space/lowercase version of name == input_product_name.strip().lower())

Ответы [ 2 ]

4 голосов
/ 13 апреля 2019

Вы можете использовать набор запросов Django annotate и выражение с его функциями базы данных .

Например, в вашем случае:

from django.db.models import Value
from django.db.models.functions import Lower, Replace


def get_product(input_product_name):
    input_product_name = input_product_name.lower().replace(' ', '')

    return Product.objects.annotate(
        lowered_nospace_name=Lower(Replace('name', Value(' '), Value('')))
    ).filter(
        lowered_nospace_name=input_product_name
    )

Обратите внимание, что SQL Trim() и Python strip() удаляют только пробелы в начале и конце вашей строки.Например, strip(' hello ') == 'hello'.

Примечание по безопасности

В этом случае может помочь написание необработанного SQL, однако используйте его только какв крайнем случае, если вы не можете выразить свой запрос с помощью методов Django QuerySet. Команда Django откажется от функции extra() в будущем, поскольку она может открыться для SQL-инъекций атак.

2 голосов
/ 13 апреля 2019
## In-case spaces are to removed from beginning and end only
Product.objects.extra(
    where=["LOWER(TRIM(name)) = %s"],
    params=[input_product_name.strip().lower()]
)
## In-case spaces are to removed from everywhere in string
Product.objects.extra(
    where=["LOWER(REPLACE(name,' ','')) = %s"],
    params=[input_product_name.strip().lower()]
)

ссылка

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