django多表关联实战
定义模型类:
from django.db import models
from django.contrib.auth.models import User ''' ---------- Django-ORM多表关联 ---------- ''' '''
需要创建的表:
1. 书籍表
2. 出版社表
3. 作者表
4. 作者详情表
''' '''
表的对应关系:
--- 一个出版社可以出版多本书籍 (一对多)
--- 书籍和作者多对多 (多对多)
--- 每个作者只能对应一个作者详情 (一对一)
''' # 1. 书籍表
class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=32) # 书名
publishDate = models.DateField() # 出版日期
price = models.DecimalField(max_digits=5, decimal_places=2) # 价格 publish = models.ForeignKey(to="Publish", to_field="nid", related_name="booklist", on_delete=models.CASCADE)
'''
publish: 字段名,表示书籍所属的出版社
与出版社表(Publish表)建立一对多的关系,外键建立在多的一方
to="Publish": 指定要关联的表
to_field="nid": 指定要关联的字段(如果不指定,则默认关联主键)
on_delete=models.CASCADE: 表示删除主键以后,外键对应的数据也被删除
related_name: 反向查找字段
''' authors = models.ManyToManyField(to="Author", related_name="booklist", db_table="tb_book_author")
'''
authors: 作者字段,与作者表Author建立多对多的关系,ManyToManyField可以在任意一方
to="Author": 指定要关联的表
db_table="tb_book_author": 多对多关系会生成第三张表,通过第三张表进行关联,
通过 db_table=xxx 指定第三张表的表名,
第三张表会生成三个字段:id、book_id、author_id '''
class Meta:
db_table = "tb_book" # 2. 出版社表
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) # 出版社名称
city = models.CharField(max_length=32) # 出版社城市
email = models.EmailField() # 邮箱 class Meta:
db_table = "tb_publish" # 3. 作者表
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
authorDetail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)
'''
authorDetail: 作者详情,与作者详情表AuthorDetail建立一对一的关系
to="AuthorDetail": 指定一对一关联的表
'''
class Meta:
db_table = "tb_author" # 4. 作者详情表
class AuthorDetail(models.Model):
nid = models.AutoField(primary_key=True)
birthday = models.DateField()
telephone = models.BigIntegerField()
addr = models.CharField(max_length=64) class Meta:
db_table = "tb_authordetail"
表操作:
################## 1 ##################
# 给出版社表Publish中添加记录,用常规方式添加即可:
# Publish.objects.create(name="西安出版社", city="西安", email="123@qq.com") ################## 2 ##################
# 一对多添加记录:给Book书籍表中添加出版社
# 方式1:先找到对应的出版社对象,然后在书籍中添加这个出版社对象
# pub_obj = Publish.objects.get(pk=1)
# Book.objects.create(title="西游记", price=120, publishDate="2020-12-03", publish=pub_obj) # 方式2:直接在书籍表中添加对应出版社的id
# Book表的出版社字段在模型类中为publish,但是在数据库表中生成的字段名为:publish_id
# Book.objects.create(title="红楼梦", price=110, publishDate="2020-11-03",publish_id=1) ################## 3 ##################
# 一对一添加记录:添加记录的方式与上面一对多的方式相同 ################## 4 ##################
# 多对多添加记录:给Book书籍添加作者
# 方式1:先获取作者的模型类对象,然后将这个对象添加到对应的书籍Book对象中
# 获取作者对象:
# tom = Author.objects.get(name="tom")
# jack = Author.objects.get(name="jack")
# 获取书籍对象:
# book = Book.objects.get(nid=1)
# 给book书籍添加tom, jack两个作者, 添加后可以通过中间表(即第三张表)关联书籍和作者
# book.authors.add(tom, jack) # 方式2:直接将作者的 id 添加到书籍对象中即可
# 获取需要添加作者的书籍:
# book = Book.objects.get(nid=1)
# 给这个书籍添加作者(给book书籍添加id==1和id==2的作者)
# book.authors.add(1, 2) ################## 5 ##################
# 一对多查询:要查询某一本书的出版社
# 方式1: 通过数据库中生成的字段publish_id查询,但是只能查询出表中publish_id的值
# book = Book.objects.get(pk=1)
# print(book.publish_id) // 结果为 1 # 方式2:通过book.publish查询,可以直接查询出book对象对应的出版社的对象(此处的publish为模型类中定义的属性)
# book = Book.objects.get(pk=1)
# print(book.publish) // 结果为:Publish object (1) ################## 6 ##################
# 多对多查询:要查询书籍对应的所有作者
# book = Book.objects.get(pk=1)
# authors = book.authors.all() # 查询book书籍对象的所有作者
# print(authors) # 返回一个QuerySet对象
# 结果:<QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]> ################## 7 ##################
# 多对多关联表 ---- 删除记录:
# book = Book.objects.get(pk=2) # 先找到需要操作的书籍对象book
# book.authors.remove(1) # 在书籍book中删除掉id=1的这个作者
# book.authors.clear() # 在书籍book中删除掉所有的作者
# book.authors.set([1,]) # set() 等价于先clear(), 再add(), 即:先删除所有作者,再添加id=1的作者到book中
数据库中生成的表结构:



django多表关联实战的更多相关文章
- day53_9_17 django数据库表关联,路由和视图
一.数据库的关系建立. 在原生的数据库语句中,建立表与表之间的联系,就是添加一个字段,将联系的表的id值添加到该字段中. django所作的也就是这些. 以图书管理系统为例,图书管理系统有四张表:书籍 ...
- Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...
- Django 07 Django模型基础2 (常用查询和多表关联)
Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...
- Django——8 关系表的数据操作 表关联对象的访问 多表查询
Django 关系表中的数据操作 表关联对象的访问 关联对象的add方法 create方法 remove方法 clear方法 多表查询 查询补充 聚合查询 分组查询 F查询 Q查询 关系表的数据操作 ...
- django框架之drf:04、序列化器常用字段及参数,序列化器高级用法之source、定制字段数据的两种方法、多表关联反序列化的保存、ModelSerializer的使用
Django框架之drf 目录 Django框架之drf 一.序列化器常用字段及参数 1.常用字段 2.常用字段参数 3.字段参数针对性分类 二.序列化器高级用法之source 1.定制字段名 三.定 ...
- Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException
简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Ha ...
- python 全栈开发,Day73(django多表添加,基于对象的跨表查询)
昨日内容回顾 多表方案: 如何确定表关系呢? 表关系是在2张表之间建立的,没有超过2个表的情况. 那么相互之间有2条关系线,先来判断一对多的关系. 如果其中一张表的记录能够对应另外一张表的多条记录,那 ...
- python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)
昨日作业讲解 1.图书管理系统 实现功能:book单表的增删改查 1.1 新建一个项目bms,创建应用book.过程略... 1.2 手动创建static目录,并在目录里面创建css文件夹,修改set ...
- django contenttype 表应用
Django contenttypes 应用 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建 ...
- drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用
目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...
随机推荐
- MogDB/openGauss 自定义snmptrapd告警信息
MogDB/openGauss 自定义 snmptrapd 告警信息 在实际使用中,默认的报警规则信息并不能很好的满足 snmp 服务端的需求,需要定制化报警信息,这里以添加 ip 为例,看似一个简单 ...
- HarmonyOS Connect FAQ第四期
原文:https://mp.weixin.qq.com/s/bvaV086QTnpnDFyYAVxQwQ,点击链接查看更多技术内容.在HarmonyOS Connect生态产品的认证测试环节,你是否存 ...
- Batch Normalization 和 DropOut
Batch-Normalization https://www.cnblogs.com/guoyaohua/p/8724433.html 有几点需要注意: \(x^{(k)}\)指的是t层的输入. 也 ...
- Android 开发入门(5)
0x07 数据存储 (1)共享参数 SharedPreferences a. 用法 用法 SharedPreferences 是 Android 的一个轻量级存储工具,采用的存储结构为键值对的方式 共 ...
- 01矩阵-【BFS】
01矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离.两个相邻元素间的距离为 1 ,方格斜方向不计算距离. 示例 1: 输入: [0 0 0 0 1 0 0 0 0] 输出: ...
- 力扣633(java&python)-平方数之和(中等)
题目: 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例 1: 输入:c = 5输出:true解释:1 * 1 + 2 * 2 = 5示例 2: 输 ...
- EasyCV开源|开箱即用的视觉自监督+Transformer算法库
简介:EasyCV是阿里巴巴开源的基于Pytorch,以自监督学习和Transformer技术为核心的 all-in-one 视觉算法建模工具.EasyCV在阿里巴巴集团内支撑了搜索.淘系.优酷.飞 ...
- GRPC: 如何优雅关闭进程(graceful shutdown)
简介: 本文将介绍优雅关闭 gRPC 微服务.在进程收到关闭信号时,我们需要关闭后台运行的逻辑,比如,MySQL 连接等等. 介绍 本文将介绍优雅关闭 gRPC 微服务. 什么是优雅关闭? 在进程收 ...
- [GPT] 用dogecoin接受付款,如何实现收款回调,不借助中心化的第三方
要在不借助中心化的第三方的情况下实现Dogecoin的收款回调,您可以按照以下步骤进行操作: 1. 设置一个用于接收收款回调的URL:您需要在您的网站或应用程序中设置一个用于接收收款回调的URL. ...
- [Docker] 使 Volume 独立于容器运行时的方式 - 让容器引擎去处理
在单纯使用 run 命令运行一个容器时,通常会使用 -v 挂载的方式来实现宿主机数据卷映射到容器内. 使用命令: $ docker run --name mysql-con -v /my/custom ...