定义模型类:

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多表关联实战的更多相关文章

  1. day53_9_17 django数据库表关联,路由和视图

    一.数据库的关系建立. 在原生的数据库语句中,建立表与表之间的联系,就是添加一个字段,将联系的表的id值添加到该字段中. django所作的也就是这些. 以图书管理系统为例,图书管理系统有四张表:书籍 ...

  2. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  3. Django 07 Django模型基础2 (常用查询和多表关联)

    Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...

  4. Django——8 关系表的数据操作 表关联对象的访问 多表查询

    Django 关系表中的数据操作 表关联对象的访问 关联对象的add方法 create方法 remove方法 clear方法 多表查询 查询补充 聚合查询 分组查询 F查询 Q查询 关系表的数据操作 ...

  5. django框架之drf:04、序列化器常用字段及参数,序列化器高级用法之source、定制字段数据的两种方法、多表关联反序列化的保存、ModelSerializer的使用

    Django框架之drf 目录 Django框架之drf 一.序列化器常用字段及参数 1.常用字段 2.常用字段参数 3.字段参数针对性分类 二.序列化器高级用法之source 1.定制字段名 三.定 ...

  6. Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException

    简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Ha ...

  7. python 全栈开发,Day73(django多表添加,基于对象的跨表查询)

    昨日内容回顾 多表方案: 如何确定表关系呢? 表关系是在2张表之间建立的,没有超过2个表的情况. 那么相互之间有2条关系线,先来判断一对多的关系. 如果其中一张表的记录能够对应另外一张表的多条记录,那 ...

  8. python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)

    昨日作业讲解 1.图书管理系统 实现功能:book单表的增删改查 1.1 新建一个项目bms,创建应用book.过程略... 1.2 手动创建static目录,并在目录里面创建css文件夹,修改set ...

  9. django contenttype 表应用

    Django contenttypes 应用 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建 ...

  10. drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用

    目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...

随机推荐

  1. HarmonyOS数据管理与应用数据持久化(二)

    通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据,当需要存储的数据没有复杂的关系模型,比如存储商品名称及对应价格.员工工号及今日是否已出勤等,由于数据复杂度低,更容易兼容不同 ...

  2. 3.1版本【HarmonyOS 第一课】正式上线!参与学习赢官方好礼>>

      [课程介绍] <HarmonyOS第一课>是跟随版本迭代不断推出的系列化课程,本期课程基于HarmonyOS 3.1版本的新技术和特性,每个课程单元里面都包含视频.Codelab.文章 ...

  3. redis 简单整理——redis 的哈希基本结构和命令[三]

    前言 简单介绍一下哈希基本结构和命令. 正文 什么是hash呢? hash也可以叫做字典.关联数组. 哈希类型是键本身又是一个键值对结构: value={{field1,value1},...{fie ...

  4. c# webapi swagger

    如何配置swagger? 在使用项目中,我们希望去查看我们的webapi的测试,那么我们是需要去有一个集成的测试的. 步骤 1.在nutget管理包中下载swagger包. 2.这样会在App_sta ...

  5. java中jar文件

    1.文档性质的jar文件 可以将有包名的类的字节码文件压缩成一个jar文件,供其他源文件用import语句导入jar文件中的类. 以下结合具体的两个类给出生成的jar文件的步骤eg23中TestTwo ...

  6. 基于信通院 Serverless 工具链模型的实践:Serverless Devs

    简介: Serverless Devs 作为开源开放的开发者工具,参编中国信通院<基于无服务器架构的工具链能力要求>标准,为行业统一规范发挥助推作用!​ 作者 | 江昱(阿里云 Serve ...

  7. MaxCompute Tunnel 技术原理及开发实战

    简介: MaxCompute(原名ODPS)是一种快速.完全托管的EB级数据仓库解决方案, 致力于批量结构化数据的存储和计算,为用户提供数据仓库的解决方案及分析建模服务.Tunnel是MaxCompu ...

  8. Flink 1.13,面向流批一体的运行时与 DataStream API 优化

    简介: 在 1.13 中,针对流批一体的目标,Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能,以及在 DataStream API 方面完善有限流作业的退出语义. 本文由 ...

  9. dotnet 6 引用 NAudio 的旧版本构建不通过

    本文告诉大家在使用 NAudio 的旧版本导致构建不通过问题,解决方法是升级到 1.10 或以上版本 在更新 dotnet 6 项目时,使用了 NAudio 的旧版本,构建失败,提示 MC1000 如 ...

  10. 2019-8-31-PowerShell-使用-WMI-获取信息

    title author date CreateTime categories PowerShell 使用 WMI 获取信息 lindexi 2019-08-31 16:55:58 +0800 201 ...