Django:名称' filter_name__icontains'未定义

发布于 2025-02-07 09:15:46 字数 1262 浏览 0 评论 0原文

我正在使用Django(DRF)应用程序中的自定义过滤器。

基本过滤(IEXACT)正在工作:

queryset = queryset.filter(**{filter_name: term.get(filter_name)}) # OK

但是我想用IContains逻辑过滤Charfields:

queryset = queryset.filter(**{filter_name__icontains: term.get(filter_name)}) # ERROR

错误文本

名称:名称'filter_name__icontains'未定义

问题:我如何支持函数中的icontains过滤?

我的代码

from django.db.models import QuerySet, CharField
from rest_framework.filters import BaseFilterBackend
from rest_framework.request import Request


    class AbstractFilterBackend(BaseFilterBackend):
        @staticmethod
        def __execute_default_filters(queryset, terms: list):
            for term in terms:
                filter_name = next(iter(term.keys()))
    
                if hasattr(queryset.model, filter_name):
                    if queryset.model._meta.get_field(filter_name).__class__ is CharField:
                        queryset = queryset.filter(**{filter_name__icontains: term.get(filter_name)})
                    else:
                        queryset = queryset.filter(**{filter_name: term.get(filter_name)})
    
            return queryset

I am working on custom filter in my Django (DRF) app.

Basic filtering (iexact) is working:

queryset = queryset.filter(**{filter_name: term.get(filter_name)}) # OK

But I want to filter CharFields with icontains logic:

queryset = queryset.filter(**{filter_name__icontains: term.get(filter_name)}) # ERROR

Error text

NameError: name 'filter_name__icontains' is not defined

Question: how can I support icontains filtering in my function?

My code

from django.db.models import QuerySet, CharField
from rest_framework.filters import BaseFilterBackend
from rest_framework.request import Request


    class AbstractFilterBackend(BaseFilterBackend):
        @staticmethod
        def __execute_default_filters(queryset, terms: list):
            for term in terms:
                filter_name = next(iter(term.keys()))
    
                if hasattr(queryset.model, filter_name):
                    if queryset.model._meta.get_field(filter_name).__class__ is CharField:
                        queryset = queryset.filter(**{filter_name__icontains: term.get(filter_name)})
                    else:
                        queryset = queryset.filter(**{filter_name: term.get(filter_name)})
    
            return queryset

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷爱 2025-02-14 09:15:46

filter_name是一个变量,但您没有定义filter_name__icontains。您可以为此使用字符串格式:

queryset = queryset.filter(**{f'{filter_name}__icontains': term.get(filter_name)})

While filter_name is a variable, you did not define filter_name__icontains. You can use string formatting for this:

queryset = queryset.filter(**{f'{filter_name}__icontains': term.get(filter_name)})
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文