Django数据库多对多

3.17 Django数据库多对多

在Django中,多对多关系通常通过一个自动创建的中间模型来实现。这个中间模型包含了两个外键,分别指向多对多关系的两端。

示例:

python 复制代码
#创建models
class Auther(models.Model):
    name=models.CharField(verbose_name='作者',max_length=32)

class Book(models.Model):
    title=models.CharField(verbose_name='书名',max_length=128)
    #auther为MToM类型,并关联到Auther
    auther=models.ManyToManyField(verbose_name='作者',to=Auther,related_name='books')
#逻辑:一个作者可以有多本书,一本书可以有多个作者

执行" python manage.py makemigrations"和"python manage.py migrate "后数据库中会生成三张表

auther:作者表

book:书本表

book_auther:关联表

python 复制代码
#添加数据
models.Auther.objects.create(name='sally')
models.Auther.objects.create(name='muyi')
models.Auther.objects.create(name='ying')
#创建三个对象
auther_obj1=models.Auther.objects.filter(name='sally').first()
auther_obj2=models.Auther.objects.filter(name='muyi').first()
auther_obj3=models.Auther.objects.filter(name='ying').first()
#插入书本数据
book_obj1=models.Book.objects.create(title='sally_book1')
book_obj2=models.Book.objects.create(title='sally_book2')
#将书本1和书本2关联到作者auther_obj1和auther_obj2
book_obj1.auther.set([auther_obj1,auther_obj2])
book_obj2.auther.set([auther_obj1,auther_obj2])
#为书本2添加一个作者auther_obj3
book_obj2.auther.add(auther_obj3)

auther:作者表:

id name
1 sally
2 muyi
3 ying

book:书本表

id title
1 sally_book1
2 sally_book2

book_auther:关联表

id book_id auther_id
1 1 1
2 1 2
3 2 1
4 2 2
5 2 3
python 复制代码
#查询数据
models.Auther.objects.create(name='sally')
auther_obj1=models.Auther.objects.filter(name='sally').first()
#查询作者sally有几本书,books为models中的related_name
print(auther_obj1.books为.all())
#查询书本'sally_book1'有几个作者
book_obj1=models.Book.objects.filter(title='sally_book1').first()
print(book_obj1.auther.all())
相关推荐
喵了几个咪8 小时前
选择第三方IAM还是自建权限体系?中小型后台系统权限架构决策指南
数据库·oracle·架构
Elastic 中国社区官方博客9 小时前
Kibana:使用 AI Chat 及 MCP 轻松创建 AI 原生仪表板
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·信息可视化
杨云龙UP10 小时前
Oracle Health Check巡检脚本使用SOP V2.0:从HTML原始报告→生成Word专业巡检报告→交付客户_2026-06-03
linux·运维·数据库·sql·oracle·报告·巡检
Database_Cool_10 小时前
Hudi 湖仓一体架构:阿里云 AnalyticDB MySQL 原生集成最佳实践
数据库·mysql·阿里云
我是一颗柠檬10 小时前
【Redis】发布订阅与消息队列Day8(2026年)
数据库·redis·后端·缓存
sukioe11 小时前
Redis 持久化+高可用详解:RDB/AOF/混合/主从/哨兵/集群
数据库·redis·缓存
全栈软件开发11 小时前
祈福导航系统V1.1更新 优化后端控制逻辑和前台UI
数据库·祈福导航系统
_qingche12 小时前
H2 数据库到 MySQL 数据迁移
java·数据库·spring boot·mysql·spring·重构·kotlin
AOwhisky12 小时前
MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
运维·数据库·笔记·学习·mysql·云计算
数据库小学妹12 小时前
MySQL ORDER BY 深度解析:Using temporary 与 Using filesort 的底层机制及索引优化实战
数据库·经验分享·mysql·性能优化·dba