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': '查无此书'})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现