我们可以在没有明确传递search_fields和filter_fields中字段名称的情况下pass all the fields of a model to django filter backend
我制作了一个通用视图集,它序列化传递给它的模型的所有字段,但是我在将通用过滤器应用到它时遇到了问题
例如,
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('username', 'email')
在上面的代码中,我们已经明确地传递了search_fields
但是在我的代码中,我不能明确地传递字段,因为每次都可以传递不同的模型。
答案 0 :(得分:2)
我不认为这样做是明智的,因为有些字段可以显示敏感信息,但您可以尝试传递模型中的所有字段:
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (filters.SearchFilter,)
search_fields = [f.name for f in User._meta.get_fields()]
Here are the docs使用get_fields
:
Options.get_fields(include_parents = True,include_hidden = False)[来源]
返回与模型关联的字段元组。
get_fields()
接受两个可用于控制哪些字段的参数 返回:
- 的 include_parents 强> 默认情况下为
True
。递归地包括在父级上定义的字段 类。如果设置为False
,则get_fields()
将仅搜索字段 直接在当前模型上声明。来自模型的字段直接 继承自抽象模型或代理类被认为是 本地的,不是父母的。- 的 include_hidden 强> 默认情况下为
False
。如果设置为True
,则会get_fields()
包括用于支持其他字段功能的字段。这个 还将包含related_name
的任何字段(例如 以“+”开头的ManyToManyField
或ForeignKey
)。
答案 1 :(得分:0)
https://docs.djangoproject.com/en/1.10/ref/models/meta/
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (filters.SearchFilter,)
search_fields = [field.name for field in User._meta.fields]