Django反向包含/ icontains

Ser*_*rma 10 django django-models django-queryset

这个问题中解决LIKE了SQL中反向操作的问题,例如,如果字段名称是"Peter Johnson",我们可以通过这样的查询找到它:

select name from user where "Mr. Peter Johnson" like CONCAT('%', name, '%')
Run Code Online (Sandbox Code Playgroud)

有没有办法在Django Q对象中做这样的事情(我正在构建一个大的查询,所以使用原始SQL查询将不合理)?

小智 11

虽然附加程序确实为边缘情况提供了扩展的复杂功能,但附加程序应被视为最后的手段,并且可能会在某些时候被弃用。

这可以使用注释和过滤来完成。

from django.db.models import F, Value, CharField

MyUserModel.objects \
     .annotate(my_name_field=Value('Mr. Peter Johnson', output_field=CharField())) \
     .filter(my_name_field__icontains=F('name'))
Run Code Online (Sandbox Code Playgroud)

泛化:

from django.db.models import F, Value, CharField

@staticmethod
def reverse_case_insensitive_contains(model, search_field_name: str, search_field_value: str):
    return model.objects \
        .annotate(search_field=Value(search_field_value, output_field=CharField())) \
        .filter(search_field__icontains=F(search_field_name))
Run Code Online (Sandbox Code Playgroud)