Python 有了django过滤器,是否有一种快速的方法来支持所有可能的字段查找?

Python 有了django过滤器,是否有一种快速的方法来支持所有可能的字段查找?,python,django,django-filter,Python,Django,Django Filter,django filter允许您轻松声明模型的可过滤字段 比如说, class UserFilter(django_filters.FilterSet): class Meta: model = User fields = ['username'] 为用户名字段提供与此字段等效的精确查找 class UserFilter(django_filters.FilterSet): class Meta: model = User

django filter
允许您轻松声明模型的可过滤字段

比如说,

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = ['username']
用户名
字段提供与此字段等效的
精确
查找

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = {
            'username': ['exact']
        }
我正在寻找一种方法,支持给定字段的所有可能的查找过滤器,这样我就不必这样做:

class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User
        fields = {
            "username": ["exact", "iexact", "contains", "icontains", "startswith", ..., etc.]
        }

您可以通过

查找列表的结果:

['exact','iexact','gt','gte','lt','lte','in','contains', “icontains”、“startswith”、“istartswith”、“endswith”、“iendswith”, 'range'、'isnull'、'regex'、'iregex']


因此,您可以在
FilterSet

中使用它来覆盖
获取字段(…)
类的
FilterSet
类方法

import django_filters as filters
# If you are using DRF, import `filters` as
# from django_filters import rest_framework as filters


class AnyModelFilter(filters.FilterSet):
    class Meta:
        model = AnyModel
        fields = '__all__'

    @classmethod
    def get_fields(cls):
        fields = super().get_fields()
        for field_name in fields.copy():
            lookup_list = cls.Meta.model._meta.get_field(field_name).get_lookups().keys()
            fields[field_name] = lookup_list
        return fields
将django_过滤器作为过滤器导入
#如果您使用的是DRF,请将'filters'作为
#从django_过滤器导入rest_框架作为过滤器
类AnyModelFilter(filters.FilterSet):
类元:
model=AnyModel
字段='\uuuu所有\uuuu'
@类方法
def get_字段(cls):
fields=super()。获取_字段()
对于fields.copy()中的字段名称:
lookup\u list=cls.Meta.model.\u Meta.get\u字段(字段名称).get\u lookups().keys()
字段[字段名称]=查找列表
返回字段
def fields\u查找(MyModel):
查找={}

fields=[x.name for x in MyModel.\u meta.fields]#中的字段似乎支持ORM查找分隔符,因此您可以尝试使用“username\u in”在list@LinhNguyen是的,我能。我想问的是,是否有一种方法可以启用所有受支持的查找,而无需在我的代码中实际写入
username\uu。您从何处导入
过滤器
?如何将该类添加到视图中?@alial karaawi更新了答案,希望对您有所帮助谢谢。现在,我应该将
AnyModelFilter
添加到视图中吗?可能吧,但这完全取决于您将如何使用它
import django_filters as filters
# If you are using DRF, import `filters` as
# from django_filters import rest_framework as filters


class AnyModelFilter(filters.FilterSet):
    class Meta:
        model = AnyModel
        fields = '__all__'

    @classmethod
    def get_fields(cls):
        fields = super().get_fields()
        for field_name in fields.copy():
            lookup_list = cls.Meta.model._meta.get_field(field_name).get_lookups().keys()
            fields[field_name] = lookup_list
        return fields
def fields_lookups(MyModel):
    lookups = {}

    fields = [x.name for x in MyModel._meta.fields] #<=1) get all fields names
    for field in fields:
        lookups[field] = [*MyModel._meta.get_field(
            field).get_lookups().keys()]            #<=2) add each field to a `dict`and set it vlaue to the lookups
    return lookups


class StatsticsView(ItemsView):
    queryset = MyModel.objects.all()
    serializer_class = StatisticSer

    filterset_fields = fields_lookups(MyModel) #<= ✅

    def get(self, request, *args, **kwargs):
        ....
    def put(self, request, *args, **kwargs):
        ....
    .
    .
    .