【问题标题】:Django: name 'filter_name__icontains' is not definedDjango:未定义名称“filter_name__icontains”
【发布时间】:2022-06-15 05:17:30
【问题描述】:

我正在我的 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

错误文本

NameError: name 'filter_name__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

【问题讨论】:

    标签: python-3.x django django-rest-framework


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了,非常感谢!祝你一切顺利!
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 2018-07-14
    • 2017-12-25
    • 2022-01-25
    • 2021-07-17
    • 2012-05-13
    相关资源
    最近更新 更多