Django---图书管理系统,多对多(ManyToMany),request获取多个值getlist(),反查(被关联的对象.author_set.all)
Django---图书管理系统,多对多(ManyToMany),request获取多个值getlist(),反查(被关联的对象.author_set.all)
一丶多对多查询
表建立多对多关系的方式
django通过ManyToManyField自动创建第三张表
# 1 . django通过ManyToManyField自动创建第三张表
class Book(models.Model):
title = models.CharField(max_length=32)
pub = models.ForeignKey('Publisher', on_delete=models.CASCADE)
# authors = models.ManyToManyField('Author') # 描述多对多的关系 不生成字段 生成关系表
def __repr__(self):
return self.title
__str__ = __repr__
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField('Book') # 描述多对多的关系 不生成字段 生成关系表
手动创建第三张表
class Book(models.Model):
title = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book_Author(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
date = models.DateField()
自己创建 + ManyToManyField(仅限查询)
# 使用 手动创建第三章表和 ManyToMany字段时. ManyToMany的set功能可能不会更好的应用,当第三张表存在其他的字段不能通过set设置值.
class Book(models.Model):
title = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField(Book, through='Book_Author')
class Book_Author(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
date = models.DateField() # 不能通过ManyToMany字段的set设置值
查询
# python后端
all_authors = models.Author.objects.all().order_by('id')
for author in all_authors:
print(author)
print(author.name)
print(author.pk)
print(author.books) # 关系管理对象
print(author.books.all()) # 查询所有的,所关联的所有对象
# html前端
{% for author in all_author %} ## 循环得到每个作者对象
<tr>
<td>
<input type="checkbox" >
</td>
<td>{{ forloop.counter }}</td>
<td>{{ author.pk }}</td>
<td>{{ author.username }}</td>
<td>
# book_obj 是从后端传递过来的对象,
# author.books.all 是通过查询 Author表中的books属性获得一个关系管理对象,
# .all 在前端页面不用加括号 ,查询到的是每一个book图书对象.
{% for book_obj in author.books.all %}
<< {{ book_obj.bname }}>>
{% endfor %}
</td>
<td><a class="btn btn-warning btn-sm" href="/author_edit?pk={{ author.pk }}">编辑</a> <a class="btn btn-danger btn-sm" href="/author_del?pk={{ author.pk }}">删除</a>
</td>
</tr>
{% endfor %}
新增
# python后台 request接收前端发过来的数组类型的数据. 使用getlist()
books = request.POST.getlist('books') # 获取多个元素
# 新建作者
author_obj = models.Author.objects.create(name=name)
# 给作者和书籍绑定关系
author_obj.books.set(books) # 【id,id】 # 关系管理对象使用set方法,自动循环插入数据
反查询
通过设置ManyToMany字段对应的那张表.
# 多对多
class Book(models.Model):
bname = models.CharField(max_length=32, unique=True)
bprice = models.CharField(max_length=32)
pid = models.ForeignKey('Publish', on_delete=models.CASCADE)
# 外键参数说明:
# to_field :被关联对象的用于关联的字段. 默认情况, Django 使用被关联对象的主键
# on_delete : models.CASCADE 级联删除
# models.SET(1) 将当前字段的值设置成1
# models.SET_DEFAULT 设置默认值, 需要设置default:default=11
# models.SET_NULL 设置为空,需要设置 : null=True
# models.DO_NOTHING 什么都不做,关联的数据删除后不影响当前字段的值
class Author(models.Model):
username=models.CharField(max_length=32)
books=models.ManyToManyField('Book') # 设置了多对多关系, 对应的是book对象
# 前端页面,通过book对象反查作者表中的数据 , book.author_set是一个关系管理对象
<!--反查: book.author_set.all -->
{% for author in book.author_set.all %}
{{ author.username }}
{% endfor %}
Django---图书管理系统,多对多(ManyToMany),request获取多个值getlist(),反查(被关联的对象.author_set.all)的更多相关文章
- Django图书管理系统(前端对有外键的数据表增删改查)
图书管理 书籍管理 book name 项目源码位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E ...
- Django(图书管理系统1)
day63 内容回顾 1. 单表的增删改查 1. 删和改 1. GET请求 URL传值 1. 格式 ...
- Django图书管理系统(前端对数据库的增删改查)
图书管理系统 出版社的管理 源码位置:https://gitee.com/machangwei-8/learning_materials/tree/master/%E9%A1%B9%E7%9B%AE/ ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- django 图书管理系统
一.图书管理系统 单表的增删改查 1.创建项目 2.注释掉中间件 就可以提交post 请求 3.配置静态文件 并手动创建static 文件夹存放静态文件 二.具体的数据库配置 1.创建数据库 2. ...
- Django——图书管理系统
基于Django的图书管理系统 1.主体功能 1.列出图书列表.出版社列表.作者列表 2.点击作者,会列出其出版的图书列表 3.点击出版社,会列出旗下图书列表 4.可以创建.修改.删除 图书.作者.出 ...
- django图书管理系统实例
首页,其他页面全部继承首页的上半部分 点击发布图书页面 首页点击书名,跳转到图书信息界面,该界面可删除图书 项目结构 #views.py from django.shortcuts import re ...
- Django(图书管理系统2)
day64 内容回顾 1. ORM外键操作 图书表和出版社表 多对一 的关系 # 书 class Book(models.Model): ...
- Django图书管理系统(单表操作)
以下内容需要掌握: Python3 以及前端:HTML,CSS,jQuery,BootStrap,Django,JavaScript 开启Django新项目: 1,settings.py 数据库选择: ...
随机推荐
- python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射
多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...
- Module build failed: Error: Cannot find module 'node-sass'
安装npm 遇到 Module build failed: Error: Cannot find module 'node-sass' 这次通过重装 npm 完成 先卸载npm npm uninsta ...
- CF308C-Sereja and Brackets-(线段树+括号匹配)
题意:给出一段括号,多次询问某个区间内能匹配多少括号. 题解:线段树,结构体三个属性,多余的左括号l,多余的右括号r,能够匹配的括号数val. 当前结点的val=左儿子的val+右儿子的val+min ...
- 2.搭建第一个http服务:三层架构
package main import ( "github.com/go-kit/kit/transport/http" "gomicro/Services" ...
- docker的简单操作和端口映射
一:简介 Docker镜像 在Docker中容器是基于镜像启动的 镜像是启动容器的核心 镜像采用分层设计,最顶层为读写层 使用快照COW技术,确保底层不丢失 通过ifconfig(ip a)来查看d ...
- ESP8266 LUA脚本语言开发: 准备工作-官网获取LUA固件
前言 这节咱去官网上获取lua开发的固件. 官网下载 下面是我以前写的,咱不使用官网下载的固件,咱使用自己编译的固件.. 填写好自己的的邮箱地址,然后选择好自己需要的功能,一会编译好的固件就会发到您的 ...
- 洛谷 p2055 假期的宿舍 题解
好长时间没更博客了 因为实在太蒻了 这让本蒟蒻怎么办 今天终于遇到了一道模板题(之前也有,不过太蒻了都不会) 不过...写代码5分钟,调试2小时 分界线:回归正题 这个就是普通的匈牙利算法 差不多 思 ...
- uiView获取指定子view
判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类 ...
- VS Code 安装与配置(使用MSYS2环境与mingw-w64 编译环境)
更正了顺序,之前不知道怎么回事,内容顺序乱了 力求完美.详细,所以希望懂的人留言指点一下. 目前已经开始添加原理解释,希望大家能分享一些gcc gdb C语言等方面优秀链接 后续会慢慢增添内容,修正 ...
- nginx配置神器
原文 https://mp.weixin.qq.com/s/zFEk7XzHj3xPReDXEnQxcQ https://nginxconfig.io/ Nginx作为一个轻量级的HTTP服务器,相比 ...