在Django过滤器中获取小写/无空格名称等于小写/无空格参数的对象

dun*_*bok 1 python regex django filter

我想获得所有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())
Run Code Online (Sandbox Code Playgroud)

Lua*_*yen 5

您可以将 Django 的 queryset annotateexpression与它的Database Functions 一起使用

例如,在您的情况下:

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
    )
Run Code Online (Sandbox Code Playgroud)

请注意,SQLTrim()和 Pythonstrip()仅去除字符串开头和结尾的空格。例如,strip(' hello ') == 'hello'

安全注意事项

编写原始 SQL 对您的情况有所帮助,但是,如果您无法使用 Django QuerySet 方法表达您的查询,请仅将其用作最后的手段。Django 团队将来会弃用extra()功能,因为它可能会受到SQL 注入攻击。