Django的orm中多对多外键的三种创建方式

Django的orm中多对多外键的三种创建方式


复制代码
 1 from django.db import models
 2 
 3 # 全自动:利用orm自动帮我们创建第三张关系表
 4 
 5 class Book(models.Model):
 6     name = models.CharField(max_length=32)
 7     authors = models.ManyToManyField(to='Author')
 8 
 9 class Author(models.Model):
10     name = models.CharField(max_length=32)
11 
12 """
13 优点:代码不需要你写 非常的方便 还支持orm提供操作第三张关系表的方法...
14 不足之处:第三张关系表的扩展性极差(没有办法额外添加字段...)
15 """
16 
17 
18 
19 # 纯手动
20 class Book(models.Model):
21     name = models.CharField(max_length=32)
22     
23 class Author(models.Model):
24     name = models.CharField(max_length=32)
25   
26 class Book2Author(models.Model):
27     book_id = models.ForeignKey(to='Book')
28     author_id = models.ForeignKey(to='Author')
29   '''
30   优点:第三张表完全取决于你自己进行额外的扩展
31   不足之处:需要写的代码较多,不能够再使用orm提供的简单的方法
32   不建议你用该方式
33   '''
34 
35 # 半自动
36 class Book(models.Model):
37     name = models.CharField(max_length=32)
38     authors = models.ManyToManyField(to='Author',
39                                      through='Book2Author',
40                                      through_fields=('book','author')  # through_field后对应元组,字段先后顺序:当前表是谁,就把对应的关联字段放前面
41                                      )
42 class Author(models.Model):
43     name = models.CharField(max_length=32)
44     # books = models.ManyToManyField(to='Book',
45     #                                  through='Book2Author',
46     #                                  through_fields=('author','book')
47     #                                  )
48 class Book2Author(models.Model):
49     book = models.ForeignKey(to='Book')
50     author = models.ForeignKey(to='Author')
51 
52 """
53 through_fields用元组,字段先后顺序
54     判断的本质:
55         通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
56     你也可以简化判断
57         当前表是谁 就把对应的关联字段放前面
58         
59         
60 半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法
61 """
62 
63 # 总结:需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动(写代码要给自己留一条后路)
复制代码

 

posted @   _yessir  阅读(232)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示