ToB企服应用市场:ToB评测及商务社交产业平台
标题:
多表序列化与请求和响应
[打印本页]
作者:
莱莱
时间:
2022-8-12 04:07
标题:
多表序列化与请求和响应
1 多表序列化
# 图书表,出版社表,作者,作者详情 (中间表)
复制代码
1.1 路由
urlpatterns = [<br> path('admin/', admin.site.urls),<br> path('books/', views.BookView.as_view()),<br> path('books/<int:pk>', views.BookDetailView.as_view()),<br>]
复制代码
1.2 视图类
from .models import Book,Author,AuthorDetail,Publish<br>from rest_framework.response import Response<br>from .serializer import BookSerializer<br>class BookView(APIView):<br> def get(self, request):<br> book_list=Book.objects.all()<br> #序列化<br> ser=BookSerializer(book_list,many=True)<br> return Response(ser.data)<br><br> # 反序列化的新增<br> def post(self,request):<br> ser=BookSerializer(data=request.data)<br> if ser.is_valid():<br> ser.save()<br> return Response({'code':100,'msg':'新增成功'})<br> else:<br> return Response({'code':101,'msg':'新增失败','err':ser.errors})<br><br>class BookDetailView(APIView):<br> def get(self, request,pk):<br> book=Book.objects.all().filter(pk=pk).first()<br> ser=BookSerializer(book)<br> return Response(ser.data)<br><br> def put(self,request,pk):<br> book = Book.objects.all().filter(pk=pk).first()<br> ser = BookSerializer(instance=book,data=request.data)<br> if ser.is_valid():<br> ser.save()<br> return Response({'code':100,'msg':'修改成功'})<br> else:<br> return Response({'code':101,'msg':'修改失败','err':ser.errors})
复制代码
1.3 序列化类
<br>from rest_framework import serializers<br># 相对导入---->一个py文件中如果使用相对导入,这个文件不能以脚本运行<br>from .models import Book<br># # 绝对导入<br># from app01.models import Book<br><br><br>class BookSerializer(serializers.ModelSerializer):<br> class Meta:<br> model=Book<br> # fields="__all__"<br> fields=['nid','name','price', 'publish_detail', 'author_list', 'publish','authors']<br> # depth 不要用 --->外键关联一层,我建议不要超过3 不可控,比如我们只想要某几个字段<br> # depth=1<br> extra_kwargs={<br> 'publish':{'write_only':True},<br> 'authors': {'write_only': True},<br> }<br><br> # 方式一:重写字段+必须配合一个方法,方法返回啥,该字段就是什么--->该字段只能序列化<br> publish_detail=serializers.SerializerMethodField(read_only=True)<br> def get_publish_detail(self,obj):<br> # 就是当前 book对象<br> print(obj)<br> # return obj.publish.name<br> return {'name':obj.publish.name,'city':obj.publish.city}<br><br> # 方式二:在表模型models中写方法,在序列化类中写到fields中<br><br><br> # 把所有的作者:作者名字和作者addr<br> # 方式一<br> author_list=serializers.SerializerMethodField(read_only=True)<br> def get_author_list(self,obj):<br> # 作者有多个,先拿到所有作者,---》正向查询<br> author_list=[]<br> for author in obj.authors.all():<br> author_list.append({'name':author.name,'addr':author.author_detail.addr})<br> return author_list<br><br><br>
复制代码
1.4 模型类
from django.db import models<br><br># Create your models here.<br>class Book(models.Model):<br> nid = models.AutoField(primary_key=True)<br> name = models.CharField(max_length=32)<br> price = models.DecimalField(max_digits=5, decimal_places=2)<br> # publish_date = models.DateField(null=True)<br><br> #关联关系<br> publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)<br> authors=models.ManyToManyField(to='Author') #自动生成中间表<br> def __str__(self):<br> return self.name<br><br> # def publish_detail(self):<br> # return {'name':self.publish.name,'email':self.publish.email}<br><br> # 作者详情<br> # def author_list(self):<br> # author_list=[]<br> # for author in self.authors.all():<br> # author_list.append({'name':author.name,'addr':author.author_detail.addr})<br> # return author_list<br><br><br>class Author(models.Model):<br> nid = models.AutoField(primary_key=True)<br> name = models.CharField(max_length=32)<br> age = models.IntegerField()<br> author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)<br><br> '''<br> on_delete可以选择的请情况<br> -models.CASCADE 级联删除<br> -models.SET_NULL 关联字段置为空 null=True<br> -models.SET_DEFAULT 关联字段设为默认值 default=0<br> -models.DO_NOTHING 由于数据库有约束会报错,去掉外键关系(公司都不建立外键)<br> -on_delete=models.SET(值,函数内存地址) 设置上某个值,或者运行某个函数<br> <br> <br> '''<br><br><br>class AuthorDetail(models.Model):<br> nid = models.AutoField(primary_key=True)<br> telephone = models.BigIntegerField()<br> birthday = models.DateField()<br> addr = models.CharField(max_length=64)<br><br><br>class Publish(models.Model):<br> nid = models.AutoField(primary_key=True)<br> name = models.CharField(max_length=32)<br> city = models.CharField(max_length=32)<br> email = models.EmailField()<br> def __str__(self):<br> return self.name
复制代码
2 请求与响应
2.1 请求
# django ---->请求对象----》request<br># django ---->响应对象----》render,HttpResponse,Redirect,JsonResponse---》本质都是HttpResponse<br><br># drf中---》请求对象----》新的request---》drf的Request类的对象<br># drf的请求对象<br> -request.data<br> -request.query_params<br> -request.FILES<br> <br># 控制前端传入的编码格式---》默认 :urlencoded,form-data,json<br> # 全局生效<br> -项目配置文件中加入<br> REST_FRAMEWORK = {<br> 'DEFAULT_PARSER_CLASSES':[<br> 'rest_framework.parsers.JSONParser', # 能够解析json<br> 'rest_framework.parsers.FormParser', # 能够解析urlencoded<br> 'rest_framework.parsers.MultiPartParser', #能够解析form-data<br> ],<br> }<br> # 局部生效---》视图类中配置<br> class BookView(APIView):<br> parser_classes = [JSONParser,]<br> <br> <br> # 优先级:先找 视图类---》项目配置文件----》drf配置文件
复制代码
2.2 响应
from rest_framework.response import Response<br><br>#初始化对象,传入的参数,response对象的属性<br> data=None, # 要序列化的数据,字典,列表,字符串<br> status=None, # http响应状态码<br> headers=None, # 响应头---》字典<br> -------最重要的-----<br> template_name=None, #模板名字---》浏览器看的时候,看到好看的页面,postman看,纯json<br> content_type=None # 默认json格式,前后端分离项目,前端传用json,后端响应也用json格式<br> <br> <br> <br># 浏览器看的时候,看到好看的页面,postman看,纯json----》想控制,都是json格式,无论是浏览器还是postman<br><br> # 全局生效<br> -项目配置文件中加入<br> REST_FRAMEWORK = {<br> 'DEFAULT_RENDERER_CLASSES':[<br> 'rest_framework.renderers.JSONRenderer', #json格式<br> 'rest_framework.renderers.BrowsableAPIRenderer', #浏览器格式<br> ],<br> }<br> # 局部生效---》视图类中配置<br> class BookView(APIView):<br> renderer_classes = [JSONRenderer,BrowsableAPIRenderer]<br> <br> <br> # 优先级:先找 视图类---》项目配置文件----》drf配置文件
复制代码
补充
1 相对导入和绝对导入
# 绝对导入---》绝对指的是 环境变量 sys.path 里面的路径,项目跟路径在pycharm自动加入环境变量<br># 相对导入---->一个py文件中如果使用相对导入,这个文件不能以脚本运行
复制代码
2 django国际化配置
# django 国际化---》配置文件改<br><br># 国际化相关<br>LANGUAGE_CODE = 'zh-hans'<br>#时区:改成东八区<br>TIME_ZONE = 'Asia/Shanghai'<br>USE_I18N = True<br>USE_L10N = True<br>USE_TZ = False
复制代码
3 models 的级联删除相关
'''<br> on_delete可以选择的请情况<br> -models.CASCADE 级联删除<br> -models.SET_NULL 关联字段置为空 null=True<br> -models.SET_DEFAULT 关联字段设为默认值 default=0<br> -models.DO_NOTHING 由于数据库有约束会报错,去掉外键关系(公司都不建立外键)<br> -on_delete=models.SET(值,函数内存地址) 设置上某个值,或者运行某个函数<br> '''
复制代码
4 原生django,如何向响应头写数据
def test(request):<br> obj=HttpResponse('ok')<br> # obj=render()<br> # obj=redirect('/index')<br> # obj=JsonResponse()<br> obj['xxx']='ooo' #直接放<br> return obj
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4