定义模型类:

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. centerOS网卡ens33没有inet报错failed tostart LSB: Bring up/down

    没有inet 错误 cd /etc/sysconfig/network-scripts/ vi ifcfg-ens33 添加  HWADDR=<mac_of_ens33> service ...

  2. 如何巧妙应对iOS键盘难题?

    前言 写过移动端的同学或多或少都遇到过软键盘带来的各种各样的问题,最典型的就是输入框被软键盘遮挡.fixed元素失效等问题,并且这些问题在iOS上的表现让人难以接受. webview的差异 在移动端上 ...

  3. Bash下切换conda环境

    背景:很多时候实验命令都是基于Linux系统的,但是很多人的电脑是window系统的. 使用git自带的Bash可以运行linux命令,不过有时候在bash中想使用conda环境的时候比较麻烦,具体做 ...

  4. python mmsql连接支持

    前言 因为我使用的是mmsql数据库,因为遇到一点坑,所以发布出来. 正文 准备工作: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql 下载对应 ...

  5. 如何 0 改造,让单体/微服务应用成为 Serverless Application

    简介: 随着 2013 年以 Docker 为代表的容器技术.CNCF 基金会以及 K8s 的发展等,云原生开始被广大开发者所熟知.云原生时代之前还有两个阶段:一是自建 IDC 机房,二是简单地把原有 ...

  6. Linux系统诊断-内存基础

    简介: Linux系统诊断-内存基础 1. 背景 谈及linux内存,很多时候,我们会关注free,top等基础命令.当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力. ...

  7. 斩获大奖|阿里云PolarDB-X引领云原生分布式数据库新时代

    简介:阿里云原生分布式数据库PolarDB-X荣获"2021年度最佳分布式数据库". 12月15-16日,以"引领分布式云变革 助力湾区数字经济"为主题的全球分 ...

  8. 【详谈 Delta Lake 】系列技术专题 之 湖仓一体( Lakehouse )

    简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章.众所周知,Databricks 主导着开源大数据社区 Apache Spark.Delta L ...

  9. 多任务多目标CTR预估技术

    ​简介: 多目标(Multi Objective Learning)是MTL中的一种.在业务场景中,经常面临既要又要的多目标问题.而多个目标常常会有冲突.如何使多个目标同时得到提升,是多任务多目标在真 ...

  10. CPU Burst有副作用吗?让数学来回答!| 龙蜥技术

    ​简介: 使用CPU Burst的副作用是什么?是否有不适用的场景呢?戳我给你答案~ 编者按:CPU Burst 特性已合入 Linux 5.14,Anolis OS 8.2.Alibaba Clou ...