• Django中的 返回json对象的方式


    在返回json对象的几种方式:

    1

    from django.shortcuts import render, HttpResponse
    
    # Create your views here.
    from django.views import View
    from app01 import models
    import json
    class BookListView(View):
        """使用json进行json序列化"""
    
        def get(self, request):
            """以json形式返回书籍的列表"""
            # 1. 获取所有的书籍对象
            # models.Book.objects.all() queryset 类型的对象,不能直接json
            queryset = models.Book.objects.all().values('id', 'title', )
            # 2. 将数据序列化成json格式   date类型的数据不能直接系列化 ensure_ascii=False 修改乱码的现象
            ret = json.dumps(list(queryset), ensure_ascii=False)
            # 3. 返回
            return HttpResponse(ret)

    2 使用JsonResponse返回数据。实现简单的序列化

    from django.http.response import JsonResponse
    
    
    class BookListView(View):
        """使用JsonResponse进行json序列化"""
    
        def get(self, request):
            """以json形式返回书籍的列表"""
            # 1. 获取所有的书籍对象
            queryset = models.Book.objects.all()
         ret = [] for book in queryset: tmp = {} tmp['id'] = book.pk tmp['title'] = book.title tmp['pub_date'] = book.pub_date # 时间类型的有问题,这里没有修改 tmp['publisher'] = book.publisher_id tmp['authors'] = [i.pk for i in book.authors.all()] ret.append(tmp) print(ret) return JsonResponse(list(queryset), safe=False, json_dumps_params={'ensure_ascii': False})

     3 用django内置的进行json序列化

    from django.core import serializers
    class BookListView(View):
        """使用django内置的进行json序列化"""
    
        def get(self, request):
            """以json形式返回书籍的列表"""
            # 1. 获取所有的书籍对象
            queryset = models.Book.objects.all()
            # 2. 将数据序列化成json格式
            data = serializers.serialize('json', queryset=queryset)
            # 3. 返回
            return HttpResponse(data)

    4使用djangorestful进行json序列化

    class BookSerializer(serializers.Serializer):
        id = serializers.IntegerField(required=False)
        title = serializers.CharField()
        pub_date = serializers.DateField()
    
    
    #python -m pip install djangorestframework
    # 在setting.py中 将rest_framework 写下 INSTALLED_APPS列表中
    from rest_framework.views import APIView
    from rest_framework.response import Responseclass BookListView(APIView):
        """使用djangorestful进行json序列化"""
        def get(self, request):
            """以json形式返回书籍的列表"""
            # 1. 获取所有的书籍对象
            queryset = models.Book.objects.all()
            # 2. 将数据序列化成json格式,many=True将数据一个一个的循环
            ser_obj = BookSerializer(queryset, many=True)
            # 3. 返回
            return Response(ser_obj.data)

     5 使用serializers.ModelSerializer返回

    class BookModelSerializer(serializers.ModelSerializer):
        # 自定义数据库不存在的字段
        category_info = serializers.SerializerMethodField()  # 找  get_字段名的方法 执行
        publisher_info = serializers.SerializerMethodField()
        author_info = serializers.SerializerMethodField()
    
        def get_category_info(self, obj):
            return obj.get_category_display()
    
        def get_publisher_info(self, obj):
            ser_obj = PublisherSerializer(obj.publisher)
            return ser_obj.data
    
        def get_author_info(self, obj):
            ser_obj = AuthorSerializer(obj.authors.all(),many=True)
            return ser_obj.data
    
    
        class Meta:
            model = models.Book
            fields = '__all__'
            # depth = 1  # 跟对象关联的内容   属性read_only = True
            # exclude = [] #排除那些字段
            # exclude fields 不能同时存在
            # 自定义的字段
            extra_kwargs = {
                'category': {'write_only': True},
                'publisher': {'write_only': True},
                'authors': {'write_only': True},
            }



    class BookView(APIView):
    def get(self, request, pk):
    """获取一本书的详情"""
    # 1. 根据PK获取一本书的对象
    book_obj = models.Book.objects.filter(pk=pk).first()
    if book_obj:
    # 2. 对书的对象进行json序列化
    # ser_obj = BookSerializer(book_obj)
    ser_obj = BookModelSerializer(book_obj)
    # 3. 返回json数据
    return Response(ser_obj.data)
    else:
    return Response({'error': '查无此书'})

    def put(self, request, pk):
    """修改一本书"""
    # 1. 获取书籍对象
    book_obj = models.Book.objects.filter(pk=pk).first()

    # 2. 使用序列化器对数据进行校验 保存
    # partial=True 修改局部的信息,不加需要提交所有的信息
    ser_obj = BookModelSerializer(data=request.data, instance=book_obj, partial=True)
    if ser_obj.is_valid():
    ser_obj.save()
    # 3. 返回修改后的对象的json数据
    return Response(ser_obj.data)
    else:
    return Response(ser_obj.errors)

    def delete(self, request, pk):
    """删除一本书"""
    # 1. 获取书籍对象
    book_obj = models.Book.objects.filter(pk=pk).first()
    if book_obj:
    # 2. 删除
    book_obj.delete()
    # 3. 返回json数据
    return Response({'msg': '删除成功'})
    else:
    return Response({'error': '查无此书'})
     

      

  • 相关阅读:
    windows“画图”工具用法
    数字信号处理的流程
    怎样去掉桌面图标蓝色阴影
    Linux下Wi-Fi配置工具2
    vs2005下面编译自己的luars232.dll
    [spring]03_装配Bean
    [Java IO]02_字节流
    [Java IO]01_File类和RandomAccessFile类
    [Spring]01_环境配置
    Notepad++ 实用技巧
  • 原文地址:https://www.cnblogs.com/lulin9501/p/11341218.html
Copyright © 2020-2023  润新知