Django模型层实现多表关系创建和多表操作

Django模型层实现多表关系创建和多表操作,博智网带你了解详细信息 。
目录

  • 前言
  • 创建表关系
  • 多表数据操作 - 增删改
    • 一对多&一对一关系 - 增删改
      • 增加数据
      • 删除数据
      • 修改数据
    • 多对多关系 - 增删改
      • 增加多对多关系 - add()
      • 删除多对多关系 - remove()
      • 修改多对多关系 - set()
      • 清空第三张表某个对象的绑定关系 - clear()
  • 多表查询
    • 子查询
      • 正向查询
      • 反向查询
    • 联表查询
      • 正向查询
      • 反向查询
  • 聚合查询
    • 分组查询
      • F与Q查询
        • F查询
          • Q查询
          • django开启事务

            前言
            继续上面一篇文章的内容,本文介绍多表操作 。使用django ORM可以创建多表关系,并且也支持多张表之间的操作,以创建表关系和查询两部分说明django ORM的多表操作 。以作者、图书、出版社和作者信息几张表作为案例进行说明 。

            创建表关系
            注意:在实际开发中不推荐使用外键建立表关系即不使用级联更新和级联删除,而是推荐使用逻辑上的外键关系建立表关系 。
            上述的四张表中,图书和出版社这两表的关系属于一对多的关系,外键建立在查询频率高的一方 。作者和作者详情表属于一对一关系,外键建立在查询频率高的一方,作者和图书属于多对多关系,需要第三张表存储关系,建议将外键建在查询频率高的一方 。创建表时一定要执行数据库迁移命令哦~
            创建表关系时可以先将表模型创建出来,然后再添加外键字段,另外在使用django ORM创建外键关系时,关联的外键字段会自动在字段后加_id,表与表之间的关系默认以主键作为关联字段 。另外在创建表关系时,不建议使用实质的外键进行关联,而是通过使用逻辑上的关系来指定表关系 。
            class Book(models.Model):name = models.CharField(max_length=60, verbose_name='图书名')# 浮点数字段,max_digits表示数字共8位,decimal_place表示小数点占2位price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='图书价格')inventory_num = models.IntegerField(verbose_name='库存数量')sell_num = models.IntegerField(verbose_name='卖出数量')# 一对多关系外键字段创建使用 ForeigenKey(to='表名'),默认关联主键字段, db_constraint=Flase表示不建立实质的外键关系,只是逻辑上的关系publish = models.ForeignKey(to='Publish', on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='外键关联出版社')# 多对多关系,使用ManyToManyField(to='表名'),author是一个虚拟的字段,主要是用来告诉ORM,书籍和作者是多对多的关系,而且ORM会自动创建多对多关系的第三张author = models.ManyToManyField(to='Author', on_delete=models.DO_NOTHING,db_constraint=False, verbose_name='外键关联作者')class Publish(models.Model):name = models.CharField(max_length=12, verbose_name='出版社名称')class Author(models.Model):name = models.CharField(max_length=10, verbose_name='作者名称')# 一对一关系使用OneToOneField(to='表名')author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='外间关联作者详情')class AuthorDetail(models.Model):age = models.IntegerField(verbose_name='年龄')phone = models.CharField(max_length=11, verbose_name='手机号')
            另外还需补充一点,多对多的表关系共有三种创建方式,分别是全自动创建、半自动创建和全手动创建:
            # 全自动创建 - ManyToManyField,一般这种方式可以满足需求'''使用全自动创建多对多关系的优点就是无需手动创建第三张表,非常方便,django ORM直接提供操作第三张表关系的方法缺点就是无法扩展第三张关系表'''class Book(models.Model): name = models.CharField(max_length=32)authors = models.ManyToManyField(to='Author')class Author(models.Model):name = models.CharField(max_length=32)# 纯手动创建 -ForeignKey手动创建第三张表'''第三张表完全取决于手动的扩展,但是需要写的代码较多,而且无法使用ORM提供的简单方法'''class Book(models.Model):name = models.CharField(max_length=32)class Author(models.Model): name = models.CharField(max_length=32) class Book2Author(models.Model):book_id = models.ForeignKey(to='Book')author_id = models.ForeignKey(to='Author')# 半自动创建,通过ManyToManyField的参数控制第三张表class Book(models.Model):name = models.CharField(max_length=32)authors = models.ManyToManyField(to='Author', # 告诉ORM不需要自动帮忙创建第三张关系表through='Book2Author', # 告诉ORM第三张关系表对应的表的外键字段through_fields=('book','author')# 通过哪两个字段关联表,当前在哪张表,就先写哪个表的关联字段)class Author(models.Model):name = models.CharField(max_length=32)class Book2Author(models.Model):book = models.ForeignKey(to='Book')author = models.ForeignKey(to='Author')