定义模型类:

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. Mybatis终极案例之注解开发

    Mybatis终极案例之注解开发 一.注解开发实现CURD操作 1.环境搭建 参考入门案例,环境搭建主要分为如下几步: 1.配置pom.xml <packaging>jar</pac ...

  2. Spring JDBCTemplet通用RowMapper帮助类

    1 import java.lang.reflect.Method; 2 import java.math.BigDecimal; 3 import java.math.BigInteger; 4 i ...

  3. python websocket 参数

    websocket中就有建立连接connect.发送消息send等函数可供使用,但是websocket.WebSocketApp将这些都封装好了,只用在实例化的时候传入自定义函数即可,更方便.因此这里 ...

  4. 当大火的文图生成模型遇见知识图谱,AI画像趋近于真实世界

    简介: 模型免费开放!零基础也能一键进行AI艺术创作.本⽂简要介绍ARTIST的技术解读,以及如何在EasyNLP框架中使⽤ARTIST模型. 导读 用户生成内容(User Generated Con ...

  5. 阿里云 EMR Delta Lake 在流利说数据接入中的架构和实践

    简介: 为了消灭数据孤岛,企业往往会把各个组织的数据都接入到数据湖以提供统一的查询或分析.本文将介绍流利说当前数据接入的整个过程,期间遇到的挑战,以及delta在数据接入中产生的价值. 背景 流利说目 ...

  6. 【深度】阿里巴巴万级规模 K8s 集群全局高可用体系之美

    简介: 台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:"第一个十年我才华横溢,'贼光闪现',令周边黯然失色:第二个十年,我终于'宝光现形',不再去抢风头,反而与身边的 ...

  7. Apsara Stack 2.0技术百科(9宫格)

    ​ ​ ​​​​​​​​ 原文链接 本文为阿里云原创内容,未经允许不得转载. ​

  8. selenium项目中遇到的问题总结

    问题:在pycharm中运行用例能成功,在命令行运行提示找不到com包解决办法:添加一个PYTHONPATH的环境变量,值为工程目录的路径 当要查找的文本前后有换行时,用如下方法解决//td[cont ...

  9. Competition Set - 模拟赛 I

    HNOI2017 Day2 2023-06-10 注:Day2T2换为BJOI2017Day2T1,以匹配学习进度 A.大佬 B.抛硬币 C.喷式水战改 A 大佬 你需要用 \(n\) 天挑战一名大佬 ...

  10. 一键自动化博客发布工具,用过的人都说好(segmentfault篇)

    segmentfault是我在这些平台中看过界面最为简洁的博客平台了. 今天就以segmentfault为例,讲讲在blog-auto-publishing-tools中的实现原理. 前提条件 前提条 ...