【问题标题】:Return only funded fields in response(Django Rest SearchFilter)仅返回受资助的字段作为响应(Django Rest SearchFilter)
【发布时间】:2017-01-22 05:52:01
【问题描述】:

我有ViewSet,在filter_backends 中有SearchFilter 和两个search_fields。如何返回 JSON 代表唯一的字段结果? 例如,如果我使用“jo”子字符串发送搜索响应,我将只有一个字段用于此搜索(资助的用户名或全名),而不是每个 JSON 对象中的用户名和电子邮件:

{
    [{
        "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')

【问题讨论】:

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


    【解决方案1】:

    我将创建一个将搜索参数作为参数的序列化器工厂函数:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-09
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2021-07-24
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多