【笔记】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 ...
随机推荐
- C语言学习笔记--#和##操作符
1. #运算符 (1)#运算符用于在预处理期将宏的参数转换为字符串 (2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符 (3)用法:#define STRING(x) ...
- executeUpdate,executeQuery,executeBatch 的区别
executeQuery : 用于实现单个结果集,例如: Select 一般使用executeQuery 就是来实现单个结果集的工具 executeUpdate 用于执行 INSERT.UPDATE ...
- hadoop再次集群搭建(3)-如何选择相应的hadoop版本
之前接触过很多很多hadoop版本,现在重新搭建平台,面临选择哪个版本的问题. 当我们决定是否采用某个软件用于开源环境时,通常需要考虑以下几个因素: (1)是否为开源软件,即是否免费. (2) 是否有 ...
- 下拉框value ,selectedIndex
- oracle创建完实例删除的时候报ORA-01031:insufficient privileges错误,解决办法
创建了一个数据库,想删除确报了一个ORA-01031:insufficient privileges错误 查了好久,总算解决了,原因是我的电脑登录账户不在ORA_DBA系统群组中,添加进去完美删除! ...
- 基于IFC的大型三维城市群体——智慧城市模拟
- 39、count_rpkm_fpkm_TPM
参考:https://f1000research.com/articles/4-1521/v1 https://www.biostars.org/p/171766/ http://www.rna-se ...
- 两个进程之间的通讯——pipe 管道
在实际工作中,已经编辑好了NIPT_analysis的软件,该软件一般的输入文件是sam文件,但是为了集成进入测序仪器,需要直接从比对软件的标准输出中读取sam文件,省去了比对软件和NIPT_anal ...
- vimrc 我的专属vim配置
set nu set wrap syntax on filetype on "打开vim文件类型自动检测功能 set autoindent set smartindent set ruler ...
- HDU 5033 Building (维护单调栈)
题目链接 题意:n个建筑物,Q条询问,问所在的位置,看到天空的角度是多少,每条询问的位置左右必定是有建筑物的. 思路 : 维护一个单调栈,将所有的建筑物和所有的人都放到一起开始算就行,每加入一个人,就 ...