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 之多对多关系相关推荐

  1. Django模型中的关系:一对一、一对多与多对多

    Django模型中的关系:一对一.一对多与多对多 数据库中的表存在关联关系,Django中的模型对应数据库中的表,因此Django中的模型也存在一对一.一对多与多对多这三种关系. 1 . 一对一关系 ...

  2. ManyToManyField多对多关系(django Many-to-many relationships)

    https://docs.djangoproject.com/zh-hans/2.1/topics/db/examples/many_to_many/ 系统讲一下多对多关系: 第一个例子是官网的不需要 ...

  3. Django删除多对多表关系 :

    删除多对多表关系 : # 删除子表与母表关联关系,让小虎不喜欢任何颜色 # 写法1: child_obj = Child.objects.get(name="apollo") co ...

  4. django与python之间关系_Django 模型中表与表之间关系

    有过数据库相关经验的人一定知道,数据库中的表一般不是独立存在的,表与表之间都会存在联系,Django的模型是数据库表与Python类之间的映射,那么模型之间也会存在关系,Django的模型之间存在3中 ...

  5. Dango-之多对多关系—基于双下划线的查询

    一对一的反向查询用表名不加_set,一对多的反向查询表名加_set 前面写了一对多的关系,在这里升级下写下多对多的关系~~ 我们从前面的小项目app01中创建了一对多关系的Publish表,从这里我们 ...

  6. NHibernate之旅(11):探索多对多关系及其关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  7. flask_sqlalchemy 多对多 关系 对中间表的操作

    文章目录 注意 多对多关系表 创建(同时添加中间表page_tag) 不可以只查询一张表来删除(这种做法只能删除一部分.) 应该查询2张表后删除(只删除 中间表page_tag 中的数据) 添加(只添 ...

  8. 【MySql】8.多对多关系表

    多对多关系: 比如在常见的订单管理数据库当中"产品"表和"订单"表之间的关系.单个订单中可以包含多个产品.另一方面,一个产品可能出现在多个订单中.因此,对于&q ...

  9. mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...

    一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...

最新文章

  1. linux加入windows域之完美方案
  2. 30.IntellJ Idea 导入已存在的Maven项目
  3. GIS地图界面和计算机图形学填充算法
  4. 消费升级背景下零食行业发展报告_趋势丨零食行业进入4.0时代
  5. WebGL(四)—— 第一个WEBGL程序
  6. win7计算机文件夹打开慢,win7开机很慢怎么办 win7电脑开机慢的优化教程
  7. tidyr | 变量取值组合、缺失值处理、变量分列与合并
  8. html中文字空心如何设置,css 中字体文本小诀窍
  9. 数据分析工具有哪些类型
  10. 微信小程序:自适应来电模拟器
  11. iOS真机不能运行,模拟器可以
  12. 计算机水平二级指什么,全国计算机二级是什么
  13. 淘宝按关键词搜索天猫商品接口调用展示
  14. 摩拜CEO胡炜炜 一席 演讲中的 点亮北京,深圳骑行动态,地图技术实现
  15. 英文产品网站的搜索引擎推广
  16. RenderSystem_Direct3D9_d 不能加载
  17. Vue 子组件接收到父组件传的值之后再渲染页面
  18. 前端总线频率(FSB)及DDR内存频率详解,彻底让你明白CPU总线带宽与内存带宽......
  19. python无序序列_Python自动化Markdown无序列表
  20. Henry前端笔记之 something about devtool

热门文章

  1. PyCharm简单使用介绍及注意事项
  2. linux内核二当家,Linux PWN从入门到熟练(二)
  3. MySQL查询语种关键字_SQL——SQL语言全部关键字详解
  4. 抓rtmp推流地址_如何实现摄像机竖屏直播推流?
  5. 龙门吊matlab,龙门吊车重物防摆双闭环PID控制设计.doc
  6. 粒子群算法tsp java_粒子群算法解决TSP问题汇总.doc
  7. Java 虚拟机诊断利器
  8. containerd 与安全沙箱的 Kubernetes 初体验
  9. Knative 基本功能深入剖析:Knative Serving 之服务路由管理
  10. mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)