首页 > 其他分享 >django多表关联实战

django多表关联实战

时间:2023-05-28 18:44:52浏览次数:47  
标签:实战 Book 多表 models django ################## book id 书籍

定义模型类:

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="[email protected]")


    ################## 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中

  

数据库中生成的表结构:

 

 

 

标签:实战,Book,多表,models,django,##################,book,id,书籍
From: https://www.cnblogs.com/zhangyh-blog/p/17438634.html

相关文章

  • 基于Go语言 K8s+gRPC实战云原生微服务开发
    基于Go语言K8s+gRPC实战云原生微服务开发download:3wzxit666com使用微服务架构实现高性能售票系统微服务架构是一种通过将一个大型应用程序拆分成更小和更可管理的部分来构建应用程序的方法。对于一个高性能的售票系统来说,使用微服务架构可以帮助解决一些挑战,如高负载处理能力、......
  • Go语言实战Kubernetes:使用Go编写高效的容器编排应用
    Go语言实战Kubernetes:使用Go编写高效的容器编排应用随着云计算和容器化技术的发展,Kubernetes已成为一个广泛采用的容器编排平台。本文将介绍如何使用Go语言编写高效的Kubernetes应用程序。Go语言和KubernetesGo是一种快速、可靠、简单的编程语言,由Google开发。它在网络编程和并发编......
  • RN从0到1系统精讲与小红书APP实战(2023版)
    RN从0到1系统精讲与小红书APP实战(2023版)download:3wzxit666comRN从0到1系统精讲Part2:组件和API在上一篇文章中,我们介绍了如何搭建ReactNative开发环境并创建新项目。本文将介绍ReactNative的组件和API。组件ReactNative提供了许多可重用的UI组件,如View、Text、Image等。这......
  • django中的多表关联
    一、三种关联情况 二、ORM的正向操作和反向操作1.正向操作:一个模型中定义了一个外键,通过该模型对该外键操作的操作叫做正向操作。2.反向操作:被外键所关联的模型,通过该模型对外键所在模型的操作叫做反向操作。  -------------------  关联表的详细使用方式,引用:“ ......
  • django_ORM_数据库取值
    #查询方法1:直接查询models.Info_Phone.objects.filter(mobile="157137632",id=2)#查询方法2:把查询条件放在字典里面data_list={"mobile":"157137632","id":2}models.Info_Phone.objects.filter(**data_l......
  • 阅读《java并发编程实战》第十章
    例1:简单的加锁顺序导致的死锁:publicclassLeftRightDeadlock{privatefinalObjectleft=newObject();privatefinalObjectright=newObject();publicvoidleftRight(){synchronized(left){synchronized(right){......
  • Tengine 入门实战(1)--简介及安装
    1、简介Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。Tengine特......
  • 从gitee上拉取django项目到Linux中
    1.从gitee拉取django项目: 2.安装虚拟环境: 3.创建虚拟环境: 4.进入虚拟环境: 5.安装项目模块: ......
  • 阅读《java并发编程实战》第五章
    阅读《java并发编程实战》第五章Semaphore的应用举例Semaphore的应用举例:实现一个固定大小的Set。当容器满了之后,无法add,线程阻塞。publicclassBoundedHashSet{//invariant:sizeofSetalwayslessthanorequaltogivensizeprivatefinalSet<Integer>s......
  • DRF学习第二课,实战
    1,models模型classBookInfo(models.Model):title=models.CharField(verbose_name="图书名称",max_length=32)pub_date=models.DateField(verbose_name="发布日期")read=models.IntegerField(default=0,verbose_name="阅读量")comment=......