Django中ORM多对多三种创建方式(全自动-纯手动-半自动)

一:多对多三种创建方式

1.全自动: 利用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)

优点: 代码不需要自己写 非常方便 还支持orm提供操作第三张关系表的方法
不足之处: 第三张关系表的扩展性极差(没办法额外添加字段)

2.纯手动
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)

class Book2Author(models.Model):
    book_id = models.ForeignKey(to='Book')
    author_id = models.ForeignKey(to='Author')

优点: 第三张表完全取决你自己进行额外的扩展
不足之处: 需要写的代码较多,不能再使用orm提供的简单的方法

不建议使用
3.半自动
class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author', 
                                     through='Book2Author',
                                     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')
    
半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法    
4.半自动全文解析
through : 告诉orm我跟作者是多对多的关系,我是通过我自己写的表创建关系的 该表Book2Author 创建关系

为何使用through='Book2Author'?
防止第三张表中还有其他字段,所以我们还需要一张表,来告诉第三张表, 书籍跟作者是通过哪些字段来绑定关系的

through_fields: 告诉orm书籍跟作者是通过book,author字段来绑定关系的
to = 'author'
让orm知道书籍跟作者是多对多

through = 'Book2Author'
并且告诉orm不需要再创建表,自己手动已经创建好了

through_fields
告诉orm书籍跟作者是通过book,author字段来绑定关系的
5.半自动through_fields=('book','author')的顺序
through_fields=('book','author')的顺序:

1.顺序由当前第三张查询对应关系的author表通过那个字段
2.通过book,所以book放在第一位,然后第二个字段放在第二位

through_fields字段先后顺序
    判断的本质:
        通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
    你也可以简化判断
        当前表是谁 就把对应的关联字段放前面
6.总结:
你需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动(写代码要给自己留一条后路)
posted @ 2022-03-06 22:32  AlexEvans  阅读(189)  评论(0编辑  收藏  举报