【笔记】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

三 表内容的添加

难点:

  1. 考虑到多对多的关系,添加作者姓名的同时还要添加相关著作。
  2. 通过书的表取出相关数据放到多选下拉框中以供筛选。
    视图层:
<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之多对多表的增和删的更多相关文章

  1. (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作

    单表操作-增.删.改.查 ret=models.User.objects.filter(id=1)  #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...

  2. SpringBoot系列——Spring-Data-JPA(究极进化版) 自动生成单表基础增、删、改、查接口

    前言 我们在之前的实现了springboot与data-jpa的增.删.改.查简单使用(请戳:SpringBoot系列——Spring-Data-JPA),并实现了升级版(请戳:SpringBoot系 ...

  3. SpringBoot整合Mybatis对单表的增、删、改、查操作

    一.目标 SpringBoot整合Mybatis对单表的增.删.改.查操作 二.开发工具及项目环境 IDE: IntelliJ IDEA 2019.3 SQL:Navicat for MySQL 三. ...

  4. Hibernate案例-------基于xml配置,使用Hibernate实现对员工表的增、删、改、查功能

    1.1 问题 使用Hibernate实现对员工表的增.删.改.查. 1.2 方案 Hibernate使用步骤: 导入Hibernate包,以及数据库驱动包. 引入Hibernate主配置文件hiber ...

  5. Django中ORM外键和表的关系(Django编程-4)

    外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来 ...

  6. 使用Spring整合Hibernate,并实现对数据表的增、删、改、查的功能

    1.1 问题 使用Spring整合Hibernate,并实现资费表的增.删.改.查. 1.2 方案 Spring整合Hibernate的步骤: 1.3 步骤 实现此案例需要按照如下步骤进行. 采用的环 ...

  7. Django中ORM简介与单表数据操作

    一. ORM简介  概念:.ORM框架是用于实现面向对象编程语言种不同类型系统的数据之间的转换 构建模型的步骤:重点 (1).配置目标数据库信息,在seting.py中设置数据库信息 DATABASE ...

  8. Django之ORM配置与单表操作

    ORM数据库操作流程: 1.    配置数据库(项目同名包中settings.py和__init__.py) 2.    定义类(app包中models.py),执行建表命令(Tools---> ...

  9. 【转载】JavaWeb之DBUtils QueryRunner类对数据表的增、删、查(8种结果集处理方式)、改操作

    一.使用QueryRunner类,实现对数据表的 insert delete update package com.shuhuadream.queryrunner; import java.sql.C ...

随机推荐

  1. Linux 查看一个端口的连接数

    netstat -antp|grep -i "80" |wc -l 譬如查看80端口的连接数

  2. Android 自定义格式的对话框

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaoAAADvCAIAAAAsDwfKAAAgAElEQVR4nLy9bZhcVZUofEg0GcURBk ...

  3. hibernateTemplate方法使用

  4. Alert---点击拍照弹出对话框

    /** * 照片对话框 *AlertDialog */ private void PhotoDialog() { AlertDialog.Builder builder = new Builder(m ...

  5. c++11: thread_local

    thread_local变量是C++ 11新引入的一种存储类型.它会影响变量的存储周期(Storage duration),C++中有4种存储周期: automatic static dynamic ...

  6. IO流对文件的读取操作

    /*1. 在当前项目的根目录下有一个名为“info.txt”的文件,里面存放的内容如下(可手动创建录入,不需要使用IO流): 2. 利用IO流的知识读取info.txt文件的内容, 在控制台上打印大写 ...

  7. Spring IOC容器解析及实现原理

    最近一段时间,“容器”两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助sprin ...

  8. c#操作json 使用JavaScriptSerializer

    需要引用:System.Web.Extensions /// <summary> /// json的信息.保证定义的变量和json的字段一样(也可以使用struct) /// </s ...

  9. 怎么自动响应richTextBox超级链接单击click事件

    如上图所示,怎么自动响应richTextBox超级链接单击click事件?步骤如下: 1. 增加 richTextBox1_LinkClicked 事件: 2.  编辑事件内容如下: private ...

  10. uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型

    在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等.咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的 ...