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 数据库选择: ...
随机推荐
- GitHub的SSH key配置以及常用的git命令介绍
一. GitHub的SSH key配置 (以windows为例,Mac iOS系统类似) SSH Key 是一种方法来确定受信任的计算机,从而实现免密码登录.Git是分布式的代码管理工具,远程的代码管 ...
- oracle在windows(含客户端工具pl/sql安装)下安装
安装Oracle服务器端 系统默认创建的数据库名称为orcl,可自行修改. 全局数据库名(用来唯一标示Oracle数据库,每个数据库至少由一个Oracle系统标识符(SID)引用),orcl,后面称为 ...
- offsetWidth的bug
#div1{width:200px;border:1px solid red;} 这个时候如果用 offsetWidth 提取 #div1 的宽 得到的值是 202: 也就是说 offsetWidt ...
- Python 模块A
模块的四种形式 自定义模块,例如自己定义的common.py就叫common模块 内置模块:python解释器自带的,不需要安装 第三方模块:需要自己安装,13万个库,无所不能,写库(弄得更简单) 包 ...
- js面向对象的笼统介绍
**js进阶大纲**简单的表面组成:**对象的属性分两类,一类是数据属性,一类是访问器属性**1,数据属性用来保存数据.2,访问器属性不用来保存数据,而是定义了get,set两个函数,读取属性时,自动 ...
- 引入jquery时,页面一直加载
注意jquery的引用位置最好放在<head>下面.
- Pandas | 25 文件读写
Pandas I/O API是一套像pd.read_csv()一样返回Pandas对象的顶级读取器函数. 读取文本文件(或平面文件)的两个主要功能是read_csv()和read_table().它们 ...
- datatime模块的使用
dt_now = datetime.datetime.now()print(dt_now)# 2019-05-09 14:44:32.555337 获取日期,不含时分秒today = dt_now.d ...
- 两次bfs求树的直径的正确性
结论:离树上任意点\(u\)最远的点一定是这颗树直径的一个端点. 证明: 若点\(u\)在树的直径上,设它与直径两个端点\(x,y\)的距离分别为\(S1\).\(S2\),若距离其最远的点\(v\) ...
- C语言实现linux之who功能
/* who_test.c */ #include<stdio.h> #include<string.h> #include<getopt.h> #include& ...