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

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

    全自动

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

    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8, decimal_places=2)
        # 创建多对多关系字段
        authors = models.ManyToManyField(to='Author')
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
    

    好处:

    • 在于 django orm会自动帮你创建第三张关系表
    • 还内置了操作第三张表的方法:add set remove clear

    不足:

    • 但是它只会帮你创建两个表的关系字段 不会再额外添加字段
    • 虽然方便 但是第三张表的扩展性较差 无法随意的添加额外的字段

    纯手写(不推荐)

    class Book(models.Model):
        title = models.CharField(max_length=32)
    
    
    class Authors(models.Model):
        name = models.CharField(max_length=32)
    
    
    class Book2Authors(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Authors')
    
        # 可以添加任意字段
        create_time = models.DateField(auto_now_add=True)
    

    好处:

    • 可以在第三张表添加任意字段

    不足:

    • 纯手写比较麻烦, 没有orm查询的方法

    半自动(推荐使用)

    class Book(models.Model):
        title = models.CharField(max_length=32)
    
        authors = models.ManyToManyField(to='Authors', through='Book2Authors', through_fields=("book", "authors"))
        # through 记录与哪张表的关系表,through_field来指定 哪几个外键字段
    
    class Authors(models.Model):
        name = models.CharField(max_length=32)
    
    
    class Book2Authors(models.Model):
        book = models.ForeignKey(to='Book')
        authors = models.ForeignKey(to='Authors')
        
        # 可以扩展任意字段
    
    • 当ManyToManyField只有一个参数to的情况下,orm会自动创建第三张表,如果加了through和through_fields,那么orm就不会自动帮你创建第三张表,但是它会在内部帮你维护关系,让你能够继续使用orm的跨表查询方法。
    • through参数,自己指定第三张表
    • through_fields参数,要写一个元组,告诉第三张表,通过这个元组里的两个字段知道是那两张表多对多,第三张表通过哪个字段查询 就把哪个字段放前面。
  • 相关阅读:
    java学习:字符串比较“==”与“equals”的差异及与c#的区别
    航空8联货运单的作用详解
    flash:二次贝塞尔曲线应用生成飞机路径示意图
    javascript:双链表插入排序
    javascript:算法笔记
    玩聚RT 加入对饭否的统计
    随手小记:创业瞎聊十点
    Python的win32serviceutil之疑似BUG
    撕书记忆法
    中文锐推榜优化·二
  • 原文地址:https://www.cnblogs.com/setcreed/p/11979693.html
Copyright © 2011-2022 走看看