2017-01-20 2 views
0

У меня есть ViewSet, которые имеют SearchFilter в filter_backends и два search_fields. Как вернуть JSON является единственным полевым результатом? Например, если я отправить ответ для поиска с «джо» подстроками я буду иметь только одно поле для этого поиска (имя финансируемой пользователя или полного имени), а не как имя пользователя и адреса электронной почты в каждом объекте JSON:Возврат только финансируемых полей в ответ (Django Rest SearchFilter)

{ 
    [{ 
     "username": "jonh"; 
    }, 
    { 
     "fullname": "Jonh"; 
    }, 
    { 
     "username": "jo"; 
    }, 
    { 
     "fullname": "Johnson"; 
    } 
    ] 
} 

viewsets.py:

class UserViewSet(mixins.RetrieveModelMixin, 
        mixins.UpdateModelMixin, 
        mixins.ListModelMixin, 
        viewsets.GenericViewSet): 

    queryset = User.objects.all() 
    permission_classes = (IsUserOrReadOnly,) 
    filter_backends = (filters.SearchFilter,) 
    search_fields = ('^username', '^fullname',) 

    def get_serializer_class(self): 
     if hasattr(self, 'action') and self.action == 'list': 
      return UserListSerializer 
     return UserDetailSerializer 

serializers.py:

class UserListSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'email', 'fullname') 

ответ

0

Я хотел бы создать функцию заводской Serializer, который принимает поиск Params в качестве аргумента:

def generate_user_list_serializer(search_terms): 

    class UserListSerializer(serializers.ModelSerializer): 

     class Meta: 
      model = User 
      fields = tuple(search_terms) 

    return UserListSerializer 

Затем на ваш взгляд, есть сериализатор генерируется на лету:

def get_serializer_class(self): 

    # make sure that the fields are available 
    validated_params = [p for p in self.query_params if p in Myfields] 

    return generate_user_list_serializer(self.query_params) 
Смежные вопросы