多表序列化与请求和响应

莱莱  金牌会员 | 2022-8-12 04:07:07 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 786|帖子 786|积分 2358

1 多表序列化
  1. # 图书表,出版社表,作者,作者详情   (中间表)
复制代码
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 视图类
  1. 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 序列化类
  1. ​<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 模型类
  1. 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 请求
  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 响应
  1. 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 相对导入和绝对导入
  1. # 绝对导入---》绝对指的是 环境变量   sys.path 里面的路径,项目跟路径在pycharm自动加入环境变量<br># 相对导入---->一个py文件中如果使用相对导入,这个文件不能以脚本运行
复制代码
 
2 django国际化配置
  1. # 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 的级联删除相关
  1.    '''<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,如何向响应头写数据
  1. def test(request):<br>    obj=HttpResponse('ok')<br>    # obj=render()<br>    # obj=redirect('/index')<br>    # obj=JsonResponse()<br>    obj['xxx']='ooo'  #直接放<br>    return obj
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表