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

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

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

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,要写一个元组,告诉第三张表,通过这个元组里的两个字段知道是那两张表多对多,第三张表通过哪个字段查询单表 就把哪个字段放前面。

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

posted @ 2019-10-29 20:46  chanyuli  阅读(781)  评论(0编辑  收藏  举报