码迷,mamicode.com
首页 > 其他好文 > 详细

创建多对多表关系的三种方式

时间:2019-10-29 21:42:16      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:自己   扩展   射击   意思   全自动   djang   较差   很多   好处   

创建多对多表关系的三种方式

在我们之前创建多对多表的时候,一直用的都是全自动的方式来创建第三张表的。

1.全自动(推荐使用**)
            好处在于 django orm会自动帮你创建第三张关系表
            但是它只会帮你创建两个表的关系字段 不会再额外添加字段
            虽然方便 但是第三张表的扩展性较差  无法随意的添加额外的字段
            class Book(models.Model):
                ...
                authors = models.ManyToManyField(to='Author')
            
            class Author(models.Models):
                ...

好处坏处都很明显,好处就是方便,坏处就是老板叫你加个字段你就炸了。

 2.纯手动(不推荐)
            好处在于第三张表可以任意的添加额外的字段
            不足之处在于orm查询的时候  很多方法都不支持    查询的时候非常麻烦
            class Book(models.Model):
                ...
                
            class Author(models.Models):
                ...
            
            class Book2Author(models.Model):
                book_id = models.ForeignKey(to='Book')
                author_id = models.ForeignKey(to='Author')
                create_time = models.DateField(auto_now_add=True)
                ...
        

这个就不用说了,连django存在的意义都没了,好多方法都不能用。

3.半自动(推荐使用******)
            手动建表 但是你会告诉orm 第三张表是你自己建的
            orm只需要给我提供方便的查询方法
            第三种虽然可以使用orm查询方法  
            但是不支持使用
                add()
                set()
                remove()
                clear()
            
            
            
            class Book(models.Model):
                ...
                authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))


            class Author(models.Model):
                ...
                books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author', 'book'))

            class Book2Author(models.Model):
                book = models.ForeignKey(to='Book')
                author = models.ForeignKey(to='Author')
                create_time = models.DateField(auto_now_add=True)
                ...
            # 1.半自动 一定要加两个额外的参数
                through='Book2Author', through_fields=('book','author')
            # 2.后面字段的顺序
                由第三张表通过哪个字段查询单表 就把哪个字段放前面

半自动也是最推荐使用的,虽然他不支持了那四个方法,但好在那四个方法不难写,和纯手动的比起来完全不算什么,但是要注意的是,第三张表是自己创建的,两个表都要建立一个

ManyToManyField的字段,而且里面都要加上两个参数,一个是through,意思是通过哪张表,也就是第三张表,第二个参数就是 through_fields,要写一个元组,告诉第三张表,通过这个元组里的两个字段知道是那两张表多对多,第三张表通过哪个字段查询单表 就把哪个字段放前面。

总而言之:这个告诉我们的就是,在射击项目的时候,一定要给自己留后路,防止后续的迭代更新!!!!!

创建多对多表关系的三种方式

标签:自己   扩展   射击   意思   全自动   djang   较差   很多   好处   

原文地址:https://www.cnblogs.com/chanyuli/p/11761460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!