zoukankan      html  css  js  c++  java
  • 数据库表关系:多对多的三中方式

    1、第一种django orm在创建表的时候自动帮我们创建表关系

    from django.db import models
    
    # Create your models here.
    
    #创建book表
    class Book(models.Model):
        name=models.CharField(max_length=32)
        # 第一种方式,系统帮我们自动创建了表book与表author关系
        authors=models.ManyToManyField(to='Author')
    
    #创建作者表
    class Author(models.Model):
        name=models.CharField(max_length=32)
    

    表book_authors就是系统自动创建出来的用来关联author和book表

    2、第二种纯手动创建关系表(第三张表)

    from django.db import models
    
    # Create your models here.
    
    #创建book表
    class Book(models.Model):
        name=models.CharField(max_length=32)
        # # 第一种方式,系统帮我们自动创建了表book与表author关系
        # authors=models.ManyToManyField(to='Author')
    
    #创建作者表
    class Author(models.Model):
        name=models.CharField(max_length=32)
    
    class Book2Author(models.Model):
        book=models.ForeignKey(to='Book')
        author=models.ForeignKey(to='Author')
        info=models.CharField(max_length=32)
    

      手动创建关系表的好处是可以在关系表中创建自定义字段;缺点就是不能使用orm

    3、第三种半自动创建第三种表(可扩展姓高,符合orm查询)

    from django.db import models
    
    # Create your models here.
    
    #创建book表
    class Book(models.Model):
        name=models.CharField(max_length=32)
        # # 第一种方式,系统帮我们自动创建了表book与表author关系
        # authors=models.ManyToManyField(to='Author')
        authors=models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author'))
    
    #创建作者表
    class Author(models.Model):
        name=models.CharField(max_length=32)
       # books=models.ManyToManyField(to='Book',through='Book2Author',through_fields=('author','book'))
    class Book2Author(models.Model): book=models.ForeignKey(to='Book') author=models.ForeignKey(to='Author') info=models.CharField(max_length=32)

      半自动方式关系表需要自己创建,可以自定义字段,可以符合orm查询

    通过orm查询数据:

    from django.test import TestCase
    
    # Create your tests here.
    import os
    import sys
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test01.settings")
        import django
        django.setup()
        from app01 import models
    
    
        # 查询书籍中对应的作者
        res = models.Book.objects.filter(pk=1).values('authors__name')   #基于下划线
        print(res)
    
        book_obj=models.Book.objects.filter(pk=1).first()
        res=book_obj.authors.all()
        print(res)
    

    前后端数据传输编码格式contentType

    urlencoded

      对应的数据格式:name=jason&password=555

      后端获取数据:request.POST

      注意:django会将urlencoded编码的数据解析自动放到request.POST

    formdata:

      form表单传输文件的编码格式

      后端获取文件格式数据:request.FILES

      后端获取普通键值对数据:request.POST

    application/json

      ajax发送json格式数据

      需要注意的是:编码与数据格式要保持一直

    ajax

      1、前端有哪些方式可以朝后端发请求

        浏览器窗口手动输入网址  get请求

        a标签的href属性      get请求

        form表单          get/post请求(默认是get请求)

        ajax            get/post请求

      2、ajax特点:

        异步提交

        局部刷新

      3、ajax基本语法

        提交的地址(url)

        提交的方式(type)

        提交的数据(data)    

        回调函数(success)
        $('#d1').click(function () {
            $.ajax({
              // 提交的地址
              url:'/index/',
              // 提交的方式
              type:'post',
              // 提交的数据
              data:{'name':'jason','password':'123'},
              // 回调函数
              success:function (data) { // data接收的就是异步提交返回的结果
              alert(data)
              }
            })
          })

      4、ajax默认传输数据的编码格式也是urlencoded

      5、前端后端传输数据,数据是什么格式就应该告诉别人是什么格式(数据与编码要一一对应)

      ajax传输json格式数据

      $('#d1').click(function () {
          $.ajax({
            url:'', // url参数可以不写,默认就是当前页面打开的地址
            type:'post',
            contentType:'application/json',
            data:JSON.stringify({'name':'jason','hobby':'study'}),
            success:function (data) {
              {#alert(data)#}
              {#$('#i3').val(data)#}
            }
          })
        });

      ajax传输文件
        $('#d1').click(function () {
          let formdata = new FormData();
          // FormData对象不仅仅可以传文件还可以传普通的键值对
          formdata.append('name','jason');
          // 获取input框存放的文件
          //$('#i1')[0].files[0]
          formdata.append('myfile',$('#i1')[0].files[0]);
          $.ajax({
            url:'',
            type:'post',
            data:formdata,
            // ajax发送文件需要修改两个固定的参数
            processData:false, // 告诉浏览器不要处理我的数据
            contentType:false, // 不要用任何的编码,就用我formdata自带的编码格式,    django能够自动识别改formdata对象
            // 回调函数
            success:function (data) {
            alert(data)
            }
           })
          });
      form表单与ajax异同点
      1.form表单不支持异步提交局部刷新
      2.form表单不支持传输json格式数据
      3.form表单与ajax默认传输数据的编码格式都是urlencoded

    批量插入数据
      l = []
      for i in range(10000):
      l.append(models.Book2(name='第%s本书'%i))
      models.Book2.objects.bulk_create(l) # 批量插入数据



      补充:<li><a href="?page=1">1</a></li> # 自动补全当前路径

      自定义分页器
        页码的渲染通常都是单数1,3,5,7,9,符号中国人的审美标准


        需要完善的
          1.加首页和尾页
          2.页码的个数应该是固定的


        自定义分页器的使用
        后端:
          book_list = models.Book2.objects.all()
          # 数据总条数
          all_count = book_list.count()
          # 当前页
          current_page = request.GET.get('page',1)
          # 示例一个分页器对象
          page_obj = my_page.Pagination(current_page=current_page,all_count=all_count)
          # 对总数据进行切片
          page_queryset = book_list[page_obj.start:page_obj.end]

        前端:
          {{ page_obj.page_html|safe }} # 帮你渲染的是带有bootstrap样式的分页器

  • 相关阅读:
    OA常见问题和解决方案
    如何用Visio画venn(维恩)图
    小谈SQL表的连接
    记一次视图的应用
    常用sql语句备份
    EF中关系映射问题
    .net core 2.0的一次奇特经历
    .net core 下的Area注册
    win 10+ iis 10 部署.net core 1.1 web api
    AutoMapper差异内容备份
  • 原文地址:https://www.cnblogs.com/yangzhaon/p/11025737.html
Copyright © 2011-2022 走看看