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': '查無此書'})
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM