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