亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用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 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號