多对多三种创建方式
1.全自动(用在表关系不复杂的一般情况)
class Book(models.Model):
title=models.CharField(max_length=32)
多对多关系字段
authors=models.ManyToManyField(to='Authors')
class Authors(models.Model):
name=models.CharField(max_length=32)
全自动创建第三张关系表的好处:
至始至终都没有操作第三张表,全部都是由orm自动帮你创建的
还内置了四个操作第三张表的方法
add remove set clear
不足之处:
自动创建的第三张表无法扩展需要的字段,不支持修改,表的扩展性很差
(封装程度越高,可扩展性越低)
2.纯手撸三张表(了解)
class Book(models.Model):
title=models.CharField(max_length=32)
class Authors(models.Model):
name=models.CharField(max_length=32)
class Book2Authors(models.Model):
book=models.ForeignKey(to='Book')
author=models.ForeignKey(to='Authors')
create_time=models.DateField(auto_now_add=True)
好处:
第三张表中字段个数和字段名称全都可以自己来定义
不足之处:
不再支持orm跨表查询,没有正反向查询的概念
不支持add remove set clear
3.半自动(推荐使用)
class Authors(models.Model):
name=models.CharField(max_length=32)
class Book2Authors(models.Model):
book=models.ForeignKey(to='Book')
authors=models.ForeignKey(to='Authors')
class Book(models.Model):
title=models.CharField(max_length=32)
authors=models.ManyToManyField(to='Authors',through='Book2Authors',through_fields=("book","authors"))
'''
1.当你的ManyToManyField只有一个参数的情况下,orm会自动帮你创建第三张关系表
2.如果你加了through='第三张关系表表名',
和through_fields=("关系表表字段1","关系表表字段2"),
,那么orm就不会自动帮你创建第三张表,但是它会在内部帮你维护表关系,让你能够继续使用orm的跨表查询
3.through_fields=("第三张关系表表字段1","第三张关系表表字段2")中字段放置上是有顺序的,
注意事项:
Book表中多对多关系字段,:
authors=models.ManyToManyField(to='Authors',through='Book2Authors',through_fields=("book","authors"))
through_fields【!!放在哪张表中,该表的表名就放在前面!!】
4.
through='第三张关系表表名',
through_fields=("第三张关系表表字段1","第三张关系表表字段2"),
'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!