数据库表关系:多对多的三中方式
Posted yangzhaon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库表关系:多对多的三中方式相关的知识,希望对你有一定的参考价值。
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样式的分页器
以上是关于数据库表关系:多对多的三中方式的主要内容,如果未能解决你的问题,请参考以下文章