多表序列化-请求与响应-视图介绍-相对绝对导入-Django国际化配置-models级联删除相关-原生Django如何向响应头写数据
多表序列化
1.1多表序列化
1 # 图书表,出版社表,作者,作者详情 (中间表)
1.2路由
1 urlpatterns = [ 2 path('admin/', admin.site.urls), 3 path('books/', views.BookView.as_view()), 4 path('books/<int:pk>', views.BookDetailView.as_view()), 5 ]
1.2视图类

1 from .models import Book,Author,AuthorDetail,Publish 2 from rest_framework.response import Response 3 from .serializer import BookSerializer 4 class BookView(APIView): 5 def get(self, request): 6 book_list=Book.objects.all() 7 #序列化 8 ser=BookSerializer(book_list,many=True) 9 return Response(ser.data) 10 11 # 反序列化的新增 12 def post(self,request): 13 ser=BookSerializer(data=request.data) 14 if ser.is_valid(): 15 ser.save() 16 return Response({'code':100,'msg':'新增成功'}) 17 else: 18 return Response({'code':101,'msg':'新增失败','err':ser.errors}) 19 20 class BookDetailView(APIView): 21 def get(self, request,pk): 22 book=Book.objects.all().filter(pk=pk).first() 23 ser=BookSerializer(book) 24 return Response(ser.data) 25 26 def put(self,request,pk): 27 book = Book.objects.all().filter(pk=pk).first() 28 ser = BookSerializer(instance=book,data=request.data) 29 if ser.is_valid(): 30 ser.save() 31 return Response({'code':100,'msg':'修改成功'}) 32 else: 33 return Response({'code':101,'msg':'修改失败','err':ser.errors})
1.3序列化类
from rest_framework import serializers # 相对导入---->一个py文件中如果使用相对导入,这个文件不能以脚本运行 from .models import Book # # 绝对导入 # from app01.models import Book class BookSerializer(serializers.ModelSerializer): class Meta: model=Book # fields="__all__" fields=['nid','name','price', 'publish_detail', 'author_list', 'publish','authors'] # depth 不要用 --->外键关联一层,我建议不要超过3 不可控,比如我们只想要某几个字段 # depth=1 extra_kwargs={ 'publish':{'write_only':True}, 'authors': {'write_only': True}, } # 方式一:重写字段+必须配合一个方法,方法返回啥,该字段就是什么--->该字段只能序列化 publish_detail=serializers.SerializerMethodField(read_only=True) def get_publish_detail(self,obj): # 就是当前 book对象 print(obj) # return obj.publish.name return {'name':obj.publish.name,'city':obj.publish.city} # 方式二:在表模型models中写方法,在序列化类中写到fields中 # 把所有的作者:作者名字和作者addr # 方式一 author_list=serializers.SerializerMethodField(read_only=True) def get_author_list(self,obj): # 作者有多个,先拿到所有作者,---》正向查询 author_list=[] for author in obj.authors.all(): author_list.append({'name':author.name,'addr':author.author_detail.addr}) return author_list
1.4模型类
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) # publish_date = models.DateField(null=True) #关联关系 publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE) authors=models.ManyToManyField(to='Author') #自动生成中间表 def __str__(self): return self.name # def publish_detail(self): # return {'name':self.publish.name,'email':self.publish.email} # 作者详情 # def author_list(self): # author_list=[] # for author in self.authors.all(): # author_list.append({'name':author.name,'addr':author.author_detail.addr}) # return author_list class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE) ''' on_delete可以选择的请情况 -models.CASCADE 级联删除 -models.SET_NULL 关联字段置为空 null=True -models.SET_DEFAULT 关联字段设为默认值 default=0 -models.DO_NOTHING 由于数据库有约束会报错,去掉外键关系(公司都不建立外键) -on_delete=models.SET(值,函数内存地址) 设置上某个值,或者运行某个函数 ''' class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) telephone = models.BigIntegerField() birthday = models.DateField() addr = models.CharField(max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name
请求与响应
2.1请求
# django ---->请求对象----》request # django ---->响应对象----》render,HttpResponse,Redirect,JsonResponse---》本质都是HttpResponse # drf中---》请求对象----》新的request---》drf的Request类的对象 # drf的请求对象 -request.data -request.query_params -request.FILES # 控制前端传入的编码格式---》默认 :urlencoded,form-data,json # 全局生效 -项目配置文件中加入 REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES':[ 'rest_framework.parsers.JSONParser', # 能够解析json 'rest_framework.parsers.FormParser', # 能够解析urlencoded 'rest_framework.parsers.MultiPartParser', #能够解析form-data ], } # 局部生效---》视图类中配置 class BookView(APIView): parser_classes = [JSONParser,] # 优先级:先找 视图类---》项目配置文件----》drf配置文件
2.2响应
from rest_framework.response import Response #初始化对象,传入的参数,response对象的属性 data=None, # 要序列化的数据,字典,列表,字符串 status=None, # http响应状态码 headers=None, # 响应头---》字典 -------最重要的----- template_name=None, #模板名字---》浏览器看的时候,看到好看的页面,postman看,纯json content_type=None # 默认json格式,前后端分离项目,前端传用json,后端响应也用json格式 # 浏览器看的时候,看到好看的页面,postman看,纯json----》想控制,都是json格式,无论是浏览器还是postman # 全局生效 -项目配置文件中加入 REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES':[ 'rest_framework.renderers.JSONRenderer', #json格式 'rest_framework.renderers.BrowsableAPIRenderer', #浏览器格式 ], } # 局部生效---》视图类中配置 class BookView(APIView): renderer_classes = [JSONRenderer,BrowsableAPIRenderer] # 优先级:先找 视图类---》项目配置文件----》drf配置文件
*****小知识点
# 相对导入和绝对导入
# 绝对导入---》绝对指的是 环境变量 sys.path 里面的路径,项目跟路径在pycharm自动加入环境变量# 相对导入---->一个py文件中如果使用相对导入,这个文件不能以脚本运行
# Django国际化配置 # django 国际化---》配置文件改 # 国际化相关 LANGUAGE_CODE = 'zh-hans' #时区:改成东八区 TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False # models级联删除相关 ''' on_delete可以选择的请情况 -models.CASCADE 级联删除 -models.SET_NULL 关联字段置为空 null=True -models.SET_DEFAULT 关联字段设为默认值 default=0 -models.DO_NOTHING 由于数据库有约束会报错,去掉外键关系(公司都不建立外键) -on_delete=models.SET(值,函数内存地址) 设置上某个值,或者运行某个函数 ''' # 原生Django,如何向响应头写数据 def test(request): obj=HttpResponse('ok') # obj=render() # obj=redirect('/index') # obj=JsonResponse() obj['xxx']='ooo' #直接放 return obj
分类:
DRF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人