【问题标题】:How change JSON response result in POST request | DRF?如何在 POST 请求中更改 JSON 响应结果 | DRF?
【发布时间】:2018-08-06 20:33:41
【问题描述】:

我有点困惑,需要一些建议如何正确组织视图。在我的 Django REST Framework 项目中,我有非常简单的模型和序列化程序。

models.py

class Article(models.Model):
    body = models.TextField()

serializers.py

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ('id', 'body')

假设我在数据库中有下一个数据:

ID | BODY
-------------------------------------------------------------
1  | Aki doing his homework about japanese robot in library.
2  | All chapters are accompanied by necessary links.
3  | Japanese robot Aki doing a lot of tasks.

现在我尝试通过POSTArticleFilterView 控制器发送JSON 请求:

curl -X POST -H "Content-Type: application/json" -d '[
{
    "first": ["Aki", "robot"], 
    "second": ["doing", "library"]
}]'

http://localhost:8000/api/article/filter/

如果任何文章在正文字段中包含“Aki”和“机器人”字样,我想将该文章添加到 JSON 响应中。同时我需要从文本中删除“doing”和“library”这两个词。

输入:

[{
    "fisrt": ["Aki", "robot"], 
    "second": ["doing", "library"]
}]

输出:

[
{"id": 1, "body": "Aki his homework about japanese robot in ."},
{"id": 3, "body": "Japanese robot Aki a lot of tasks."},
]

views.py:

class ArticleFilterView(APIView):
    parser_classes = (JSONParser,)

    def post(self, request, format=None):
        # some code
        return Response({'received data': request.data})

settings.py:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
}

urls.py:(在settings.py文件所在的同一目录中)

urlpatterns = [
    path('api/', include('article.urls')),
]

文章/urls.py:

urlpatterns = [
    path(
        'article/filter/',
        ArticleFilterView.as_view(),
        name='article_filter',
    ),
]

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我认为,这会奏效。 (我只提到逻辑,而不是确切的代码)

    class ArticleFilterView(APIView):
        parser_classes = (JSONParser,)
    
        def post(self, request, format=None):
            # some code
            return_data = {}
            if first got a match:
                return_data.update({'received data': request.data[0]['first']})
            elif second got a match:
                return_data.update({'received data': request.data[0]['second']})
            return_data.update({"search_result":your_serch_result})
            return Response(data=return_data)
    



    更新
    视图的完整实现

    from django.db.models import Q
    
    
    class ArticleFilterView(APIView):
        parser_classes = (JSONParser,)
    
        def post(self, request, format=None):
            for key, value in request.data.items():
                my_filter = Q()
                for search in value:
                    my_filter &= Q(body__icontains=search)
                queryset = Article.objects.filter(my_filter)
                if queryset.exists():
                    serializer = ArticleSerializer(queryset, many=True)
                    return_data = {
                        "search_result": serializer.data,
                        "input_data": {key: value}
                    }
                    return Response(data=return_data)
            return Response({"message": "No data found"})
    


    但是,您的输入负载必须是 dict 之类的对象,

    {
        "first": ["Aki", "robot"], 
        "second": ["doing", "library"]
    }
    



    UPDATE-2
    views.py改成,

    from django.db.models import Q
    
    
    class ArticleFilterView(APIView):
        parser_classes = (JSONParser,)
    
        def post(self, request, format=None):
            my_filter = Q()
            for search in request.data.get('first'):
                my_filter &= Q(body__icontains=search)
    
                queryset = Article.objects.filter(my_filter)
                if queryset.exists():
                    serializer = ArticleSerializer(queryset, many=True,context={"request":request})
                    return_data = {
                        "search_result": serializer.data,
                        "input_data": {"first": request.data.get('first')}
                    }
                    return Response(data=return_data)
            return Response({"message": "No data found"})
    


    和序列化程序,

    class ArticleSerializer(serializers.ModelSerializer):
        class Meta:
            model = Article
            fields = ('id', 'body')
    
        def to_representation(self, instance):
            data = super().to_representation(instance)
            for input in self.context['request'].data.get('second'):
                data['body'] = data['body'].replace(input, "")
            return data
    

    【讨论】:

    • 评论不用于扩展讨论;这个对话是moved to chat
    • 非常感谢@JerinPeterGeorge :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多