【笔记】Django的ORM之多对多表的增和删
【笔记】Django的ORM之多对多表的增和删
一 昨日补充:外键关联
外键在ORM中的关联方式:
与数据表相关的类都放到models.py文件中
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
# 创建该数据表中的外键,如果要关联的类在该类的上面,可以用to=类名,否则加上引号
publisher = models.ForeignKey(to="Publisher")
ORM自动为该表创建名为'publisher_id'的字段
二 多对多表的创建
所对应的类:
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, null=False, unique=True)
# 该字段是实现作者表与书表多对多的关键,ORM自动创建第三张关联表。
book = models.ManyToManyField(to="Book")
ORM自动创建第三张关联表,并且命名为'author_book',表中除自己的id外还有author_id和book_id
三 表内容的添加
难点:
- 考虑到多对多的关系,添加作者姓名的同时还要添加相关著作。
- 通过书的表取出相关数据放到多选下拉框中以供筛选。
视图层:
<form action="/add_author/" method="post">
<p>
作者姓名:<input type="text" name="author_name">
</p>
<p>
作品:
<selectmultiplename="books">
{% for book in book_list %}
<optionvalue="{{ book.id }}">{{ book.title }}</option>
{% endfor %}
</select>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
def add_author(request):
err_msg = ""
all_books = models.Book.objects.all()
if request.method == 'POST':
new_name = request.POST.get('author_name')
# 当获得的数据为多个时,使用getlist函数
books_id = request.POST.getlist("books")
if new_name and books_id:
new_author_obj = models.Author.objects.create(name=new_name)
# 给新添加的作者对象连接上相关的书籍对象
new_author_obj.book.set(books_id)
return redirect('/author_list/')
else:
err_msg = "作者姓名或著作不能为空!"
return render(request, 'add_author.html', {"error": err_msg, "book_list": all_books})
四 表的修改
难点:
与添加基本相同,多了在视图层给出所要修改数据行的信息部分。
视图层:
<form action="/edit_author/" method="post">
<input type="text" name="author_id" value="{{ author.id }}" style="display: none">
<p>
作者姓名:<input type="text" name="author_name" value="{{ author.name }}">
</p>
<p>
作品:
<select multiple name="books">
{% for book in book_list %}
{# 如果当前这本书 在 当前作者关联的所有书 里面 #}
{% if book in author.book.all %}
<option selected value="{{ book.id }}">{{ book.title }}</option>
{% else %}
<option value="{{ book.id }}">{{ book.title }}</option>{% endif %}
{% endfor %}
</select>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
逻辑层:
def edit_author(request):
err_msg = ""
if request.method == "POST":
edit_id = request.POST.get("edit_id")
new_name = request.POST.get("author_name")
new_books = request.POST.getlist("books")
if new_name and new_books:
edit_author_obj = models.Author.objects.get(id=edit_id)
edit_author_obj.name = new_name
edit_author_obj.book.set(new_books)
edit_author_obj.save()
return redirect('/author_list/')
else:
err_msg = "作者姓名或著作不能为空!"
edit_id = request.GET.get("id")
edit_author_obj = models.Author.objects.get(id=edit_id)
all_books = models.Book.objects.all()
return render(request, "edit_author.html", {"edit_author": edit_author_obj, "book_list": all_books, "error": err_msg})

【笔记】Django的ORM之多对多表的增和删的更多相关文章
- (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作
单表操作-增.删.改.查 ret=models.User.objects.filter(id=1) #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...
- SpringBoot系列——Spring-Data-JPA(究极进化版) 自动生成单表基础增、删、改、查接口
前言 我们在之前的实现了springboot与data-jpa的增.删.改.查简单使用(请戳:SpringBoot系列——Spring-Data-JPA),并实现了升级版(请戳:SpringBoot系 ...
- SpringBoot整合Mybatis对单表的增、删、改、查操作
一.目标 SpringBoot整合Mybatis对单表的增.删.改.查操作 二.开发工具及项目环境 IDE: IntelliJ IDEA 2019.3 SQL:Navicat for MySQL 三. ...
- Hibernate案例-------基于xml配置,使用Hibernate实现对员工表的增、删、改、查功能
1.1 问题 使用Hibernate实现对员工表的增.删.改.查. 1.2 方案 Hibernate使用步骤: 导入Hibernate包,以及数据库驱动包. 引入Hibernate主配置文件hiber ...
- Django中ORM外键和表的关系(Django编程-4)
外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来 ...
- 使用Spring整合Hibernate,并实现对数据表的增、删、改、查的功能
1.1 问题 使用Spring整合Hibernate,并实现资费表的增.删.改.查. 1.2 方案 Spring整合Hibernate的步骤: 1.3 步骤 实现此案例需要按照如下步骤进行. 采用的环 ...
- Django中ORM简介与单表数据操作
一. ORM简介 概念:.ORM框架是用于实现面向对象编程语言种不同类型系统的数据之间的转换 构建模型的步骤:重点 (1).配置目标数据库信息,在seting.py中设置数据库信息 DATABASE ...
- Django之ORM配置与单表操作
ORM数据库操作流程: 1. 配置数据库(项目同名包中settings.py和__init__.py) 2. 定义类(app包中models.py),执行建表命令(Tools---> ...
- 【转载】JavaWeb之DBUtils QueryRunner类对数据表的增、删、查(8种结果集处理方式)、改操作
一.使用QueryRunner类,实现对数据表的 insert delete update package com.shuhuadream.queryrunner; import java.sql.C ...
随机推荐
- 部署和调优 1.7 samba 部署和优化-1
Samba服务可以实现linux上共享一个目录,windows上面访问. 安装 yum install -y samba samba-client 配置文件在 vim /etc/samba/smb.c ...
- ORA-00600:内部错误代码,参数:[kpnxdcbk-2],[],[],[],[],[],[],[],[],[],[],[]
由于最近工作中常出现ORA-00600:内部错误代码,参数:[kpnxdcbk-2],[],[],[],[],[],[],[],[],[],[],[]这种异常!所以在这里讲一下我的处理方法. 笔者所遇 ...
- re.findall 两个连续匹配成功的输出后一个
- Ros学习——Python发布器publisher和订阅器subscriber
1.编写发布器 初始化 ROS 系统 在 ROS 网络内广播我们将要在 chatter 话题上发布 std_msgs/String 类型的消息 以每秒 10 次的频率在 chatter 上发布消息 在 ...
- mysql sequelize 聚合
User.findAll({attributes: [[sequelize.fn('COUNT', sequelize.col('*')), 'email']],raw: true }).then(f ...
- pecl的使用
1. 安装方法 : pecl install packagename, 安装目录在/usr/local/php7/lib/php/extensions 例如:pecl install sealog 2 ...
- Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页
通过网站地图爬取目标站点的所有网页 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 2016 ...
- noi.ac day5t1 count
传送门 分析 首先一个很重要的性质是每个数至少出现一次 所以只有一个数会出现两次 我们只需要求出n+1个数选k个数的方案数再减去重复的部分即可 重复部分于两个相同数中间的距离有关,详见代码 代码 #i ...
- backstop无法访问
解决方案:重新build代码,重新启动虚拟机.再等一会儿,就OK了.
- 数据结构_Summary
问题描述 可怜的 Bibi 丢了好几台手机以后,看谁都像是小偷,他已经在小本本上记下了他认为的各个地点的小偷数量.现在我们将 Bibi 的家附近的地形抽象成一棵有根树. 每个地点都是树上的一个节点,节 ...