为了账号安全,请及时绑定邮箱和手机立即绑定

使用django过滤器,有没有一种快速的方法来支持所有可能的字段查找?

使用django过滤器,有没有一种快速的方法来支持所有可能的字段查找?

千巷猫影 2022-08-11 17:38:47
django-filter允许您轻松声明模型的可过滤字段。例如class UserFilter(django_filters.FilterSet):    class Meta:        model = User        fields = ['username']提供对字段的查找,该字段等效于此...exactusernameclass 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.]        }
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

将 FilterSet 类的 get_fields(...) 类方法重写为,


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


查看完整回答
反对 回复 2022-08-11
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您可以通过django查找api获得字段的所有可能的查找


lookups_list = []


lookups = User._meta.get_field("username").get_lookups()

for lookup in lookups:

    lookups_list.append(lookup)

lookups_list的结果:


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


因此,您可以在FilterSet


查看完整回答
反对 回复 2022-08-11
?
呼唤远方

TA贡献1856条经验 获得超11个赞

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):

        ....

    .

    .

    .


查看完整回答
反对 回复 2022-08-11
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信