数据库表关系:多对多的三中方式

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样式的分页器

猜你喜欢

转载自www.cnblogs.com/yangzhaon/p/11025737.html