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': '查无此书'})
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值