传递django过滤后端的所有模型字段

时间:2017-01-09 06:34:38

标签: django django-rest-framework django-filter django-filters

我们可以在没有明确传递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但是在我的代码中,我不能明确地传递字段,因为每次都可以传递不同的模型。

2 个答案:

答案 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的任何字段(例如   以“+”开头的ManyToManyFieldForeignKey)。
  •   

答案 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]