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参数,要写一个元组,告诉第三张表,通过这个元组里的两个字段知道是那两张表多对多,第三张表通过哪个字段查询 就把哪个字段放前面。
  • 相关阅读:
    P4178 Tree
    CF437D The Child and Zoo
    CF1032G Chattering ST表+倍增
    P4165 [SCOI2007]组队 推柿子+差分
    P1450 [HAOI2008]硬币购物 容斥原理+完全背包
    P6275 [USACO20OPEN]Sprinklers 2: Return of the Alfalfa P 轮廓线DP
    P6009 [USACO20JAN]Non-Decreasing Subsequences P 矩阵优化DP
    P2605 [ZJOI2010]基站选址 线段树优化DP
    P5597 【XR-4】复读 思维题 +二叉树合并
    P5304 [GXOI/GZOI2019]旅行者 最短路+位运算优化
  • 原文地址:https://www.cnblogs.com/setcreed/p/11979693.html
Copyright © 2011-2022 走看看