zoukankan      html  css  js  c++  java
  • 创建多对多表关系的三种方式

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

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

    全自动

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

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

  • 相关阅读:
    leetcode 实现-168.Excel表列名称
    leetcode 只出现一次的数字
    leetcode 67. 二进制求和
    SQl注入测试用例
    工具使用——VMware安装及使用
    Spring基础20——AOP基础
    工具使用——IDEA常用的几种插件
    Spring基础19——Spring中几种注解的区别
    Spring基础18——通过注解配置bean之间的关联关系
    Spring基础17——使用注解来配置Bean
  • 原文地址:https://www.cnblogs.com/jie9527-/p/11764703.html
Copyright © 2011-2022 走看看