首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更改JSON响应如何导致POST请求| DRF?

更改JSON响应如何导致POST请求| DRF?
EN

Stack Overflow用户
提问于 2018-08-07 04:33:42
回答 1查看 2.4K关注 0票数 2

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

models.py

代码语言:javascript
复制
class Article(models.Model):
    body = models.TextField()

serializers.py

代码语言:javascript
复制
class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ('id', 'body')

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

代码语言:javascript
复制
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请求:

代码语言:javascript
复制
curl -X POST -H "Content-Type: application/json" -d '[
{
    "first": ["Aki", "robot"], 
    "second": ["doing", "library"]
}]'

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

如果任何文章的正文字段中包含单词"Aki“和"robot”,我希望将该文章添加到JSON response中。同时,我需要从文本中删除“做”和“库”的单词。

输入:

代码语言:javascript
复制
[{
    "fisrt": ["Aki", "robot"], 
    "second": ["doing", "library"]
}]

输出:

代码语言:javascript
复制
[
{"id": 1, "body": "Aki his homework about japanese robot in ."},
{"id": 3, "body": "Japanese robot Aki a lot of tasks."},
]

views.py:

代码语言:javascript
复制
class ArticleFilterView(APIView):
    parser_classes = (JSONParser,)

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

settings.py:

代码语言:javascript
复制
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文件在同一目录下)

代码语言:javascript
复制
urlpatterns = [
    path('api/', include('article.urls')),
]

article/urls.py:

代码语言:javascript
复制
urlpatterns = [
    path(
        'article/filter/',
        ArticleFilterView.as_view(),
        name='article_filter',
    ),
]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-07 11:11:10

我想,这是可行的。(我只是提到逻辑,而不是确切的代码)

代码语言:javascript
复制
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)

更新

视图的全面实现

代码语言:javascript
复制
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的对象,

代码语言:javascript
复制
{
    "first": ["Aki", "robot"], 
    "second": ["doing", "library"]
}

更新-2

views.py更改为,

代码语言:javascript
复制
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"})

并将序列化为,

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51715256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档