Django 之多对多关系
1. 多对多关系
作者 <--> 书籍
1. 表结构设计
1. SQL版
-- 创建作者表
create table author(
id int primary key auto_increment,
name varchar(32) not null
);
-- 创建作者和书的关系表
create table author2book(
id int primary key auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key (author_id) references author(id) on delete cascade on update cascade,
constraint fk_book foreign key (book_id) references book(id) on delete cascade on update cascade
);
2. ORM版
1. 第一版:
自己创建第三张表
2. 第二版
让ORM帮我们创建第三张表
models.ManyToManyField()
3. 第三版
待补充...(ORM进阶操作的时候)
2. 作者的增删改查
1. 查询
# 展示作者
def author_list(request):# 1. 去数据库查询到所有的作者author_data = Author.objects.all()for author in author_data:print(author)# 取到每个作者出版的书籍# print(author.books) # 是一个ORM提供的桥梁(工具),帮我找对应关系print(author.books.all())# 2. 在页面上展示出来return render(request, 'author_list.html', {'author_list': author_data})
author_obj.books --> 得到的只是一个关联关系,并不能拿到数据
author_obj.books.all() --> 得到和我这个作者关联的所有书籍对象列表
2. 添加
1. add()
# 添加作者
def add_author(request):if request.method == 'POST':# 1. 取到用户填写的信息new_author_name = request.POST.get('author_name')# book_ids = request.POST.get('books') # -->这个只能取到一个值book_ids = request.POST.getlist('books')# print(new_author_name)# print(book_ids)print(request.POST.getlist('hobby'))print('-' * 120)# 2. 添加到数据库# 2.1 创建新的作者author_obj = Author.objects.create(name=new_author_name)# 2.2 创建新作者和书的对应关系author_obj.books.add(*book_ids) # 参数是一个一个单独的书籍id值# author_obj.books.set(book_ids) # 参数是书籍id值的列表# 3. 跳转到作者列表页面return redirect('/author_list/')# 1. 返回一个页面给用户,让用户填写作者信息# 2. 获取所有的书籍信息book_data = Book.objects.all()return render(request, 'add_author.html', {'book_list': book_data})
3. 删除
# 删除作者
def delete_author(request):# 1. 取到要删除的作者的id值delete_author_id = request.GET.get('kangchen')age = request.GET.get('age')print(delete_author_id)print(age)# 2. 同过id找到数据,并删除Author.objects.filter(id=delete_author_id).delete()# 3. 让用户再访问作者列表页面return redirect('/author_list/')
4. 编辑
# 编辑作者
def edit_author(request):# 1. 取到要编辑的作者的id值edit_author_id = request.GET.get('id')# 2. 找到要编辑的作者对象edit_author_obj = Author.objects.get(id=edit_author_id)if request.method == 'POST':# 3. 拿到编辑之后的数据new_author_name = request.POST.get('author_name')new_book_ids = request.POST.getlist('book_ids')# 4. 去数据库修改# 4.1 修改作者表edit_author_obj.name = new_author_nameedit_author_obj.save()# 4.2 修改作者和书的关系表edit_author_obj.books.set(new_book_ids)# 5. 跳转到作者列表页面return redirect('/author_list/')# 2.2 找到所有的书籍对象book_data = Book.objects.all()# 3. 返回一个页面return render(request, 'edit_author.html', {'author': edit_author_obj, 'book_list': book_data})
1. 模板语言中
{% if book in author.books.all %}
2. ORM编辑多对多
1. 不能直接操作第三张关系表
2. 借助ORM给提供的方法
- all()
- add(id1,id2)
- set([id1, id2])
- clear()
3. Django模板语言
1. for循环
1. forloop.last
{% if forloop.last %}
...
2. empty
{% for i in x %}
...
{% empty %}
...
{% endfor %}
4. 上传文件
form表单上传文件
views.py中
# 上传文件
def upload(request):if request.method == 'POST':# 1. 取到用户发送的数据print(request.POST)print(request.FILES)file_obj = request.FILES.get('file_name')print(file_obj.name)# 判断当前是否存在file_name = file_obj.nameif os.path.exists(os.path.join(settings.BASE_DIR, file_name)):# 如果存在同名的文件name, suffix = file_name.split('.')name += '2'file_name = name + '.' + suffix# 从上传文件对象里 一点一点读取数据,写到本地with open(file_name, 'wb') as f:# 从上传文件对象里 一点一点读取数据for chunk in file_obj.chunks():f.write(chunk)# 1. 第一次GET请求来,应该给用户返回一个页面,让用户选择文件return render(request, 'upload.html')
html文件中
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta http-equiv="content-Type" charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>上传文件示例</title>
</head>
<body><h1>上传文件</h1>
<form action="" method="post" enctype="multipart/form-data"><input type="text" name="test"><input type="file" name="file_name"><input type="submit">
</form></body>
</html>
转载于:https://www.cnblogs.com/wjs521/p/9804581.html
Django 之多对多关系相关推荐
- Django模型中的关系:一对一、一对多与多对多
Django模型中的关系:一对一.一对多与多对多 数据库中的表存在关联关系,Django中的模型对应数据库中的表,因此Django中的模型也存在一对一.一对多与多对多这三种关系. 1 . 一对一关系 ...
- ManyToManyField多对多关系(django Many-to-many relationships)
https://docs.djangoproject.com/zh-hans/2.1/topics/db/examples/many_to_many/ 系统讲一下多对多关系: 第一个例子是官网的不需要 ...
- Django删除多对多表关系 :
删除多对多表关系 : # 删除子表与母表关联关系,让小虎不喜欢任何颜色 # 写法1: child_obj = Child.objects.get(name="apollo") co ...
- django与python之间关系_Django 模型中表与表之间关系
有过数据库相关经验的人一定知道,数据库中的表一般不是独立存在的,表与表之间都会存在联系,Django的模型是数据库表与Python类之间的映射,那么模型之间也会存在关系,Django的模型之间存在3中 ...
- Dango-之多对多关系—基于双下划线的查询
一对一的反向查询用表名不加_set,一对多的反向查询表名加_set 前面写了一对多的关系,在这里升级下写下多对多的关系~~ 我们从前面的小项目app01中创建了一对多关系的Publish表,从这里我们 ...
- NHibernate之旅(11):探索多对多关系及其关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
- flask_sqlalchemy 多对多 关系 对中间表的操作
文章目录 注意 多对多关系表 创建(同时添加中间表page_tag) 不可以只查询一张表来删除(这种做法只能删除一部分.) 应该查询2张表后删除(只删除 中间表page_tag 中的数据) 添加(只添 ...
- 【MySql】8.多对多关系表
多对多关系: 比如在常见的订单管理数据库当中"产品"表和"订单"表之间的关系.单个订单中可以包含多个产品.另一方面,一个产品可能出现在多个订单中.因此,对于&q ...
- mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...
一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...
最新文章
- linux加入windows域之完美方案
- 30.IntellJ Idea 导入已存在的Maven项目
- GIS地图界面和计算机图形学填充算法
- 消费升级背景下零食行业发展报告_趋势丨零食行业进入4.0时代
- WebGL(四)—— 第一个WEBGL程序
- win7计算机文件夹打开慢,win7开机很慢怎么办 win7电脑开机慢的优化教程
- tidyr | 变量取值组合、缺失值处理、变量分列与合并
- html中文字空心如何设置,css 中字体文本小诀窍
- 数据分析工具有哪些类型
- 微信小程序:自适应来电模拟器
- iOS真机不能运行,模拟器可以
- 计算机水平二级指什么,全国计算机二级是什么
- 淘宝按关键词搜索天猫商品接口调用展示
- 摩拜CEO胡炜炜 一席 演讲中的 点亮北京,深圳骑行动态,地图技术实现
- 英文产品网站的搜索引擎推广
- RenderSystem_Direct3D9_d 不能加载
- Vue 子组件接收到父组件传的值之后再渲染页面
- 前端总线频率(FSB)及DDR内存频率详解,彻底让你明白CPU总线带宽与内存带宽......
- python无序序列_Python自动化Markdown无序列表
- Henry前端笔记之 something about devtool
热门文章
- PyCharm简单使用介绍及注意事项
- linux内核二当家,Linux PWN从入门到熟练(二)
- MySQL查询语种关键字_SQL——SQL语言全部关键字详解
- 抓rtmp推流地址_如何实现摄像机竖屏直播推流?
- 龙门吊matlab,龙门吊车重物防摆双闭环PID控制设计.doc
- 粒子群算法tsp java_粒子群算法解决TSP问题汇总.doc
- Java 虚拟机诊断利器
- containerd 与安全沙箱的 Kubernetes 初体验
- Knative 基本功能深入剖析:Knative Serving 之服务路由管理
- mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)