• 第六章、创建多对多关系的三种方式


    第六章、创建多对多关系的三种方式

    一、创建多对多关系的三种方式

    1. 全自动(推荐指度**)

    全自动:利用 ManyToManyField 让 django 自动创建第三张表
    优点:不需要手动创建第三张表
    不足:由于第三张表不是你手动创建的,也就意味着第三张表中字段是固定的,无法做扩展
                class Book(models.Model):
                    ...
                    authors = models.ManyToManyField(to='Author')
                
                class Author(models.Models):
                    ...
    

    2. 纯手动(不推荐)

    纯手动:手动创建第三张表,然后利用 Foreignkey 自己做两张表的关联
    优点:第三张表可以新增任意字段,扩展性较高
    不足:查询不方便,基于双下划线、对象的反向查询都不支持了
                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)
                    ...
    

    3. 半自动(******)

    半自动:自己创建第三张表,利用 ManyToManyField 在某张表指定关联关系
    优点:可以自定义字段,依旧支持基于双下划线、对象的反向查询,可扩展性高
    多对多字段的方法不支持了(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)
     # through 告诉 django orm 书籍表和作者表的多对多关系是通过 Book2Author 来记录的
     # through fields 告诉 django orm 记录关系时用过 Book2Author 表中的 book 字段 和 author字段 来记录的(第一个参数 book 是  关联表查 book 所依赖的字段)
     # 但是,多对多字段的 add set remove clear 四个方法就用不了了
    # 1.半自动 一定要加两个额外的参数
          through='Book2Author', through_fields=('book','author')
    # 2.后面字段的顺序
          由第三张表通过哪个字段查询单表 就把哪个字段放前面
    
    

    说明

                orm只需要给我提供方便的查询方法
                第三种虽然可以使用orm查询方法  
                但是不支持使用
                    add()
                    set()
                    remove()
                    clear()
                     # 1.半自动 一定要加两个额外的参数
                    through='Book2Author', through_fields=('book','author')
                # 2.后面字段的顺序
                    由第三张表通过哪个字段查询单表 就把哪个字段放前面
    
  • 相关阅读:
    javascript命名空间的简单实现
    javascript变量的作用域
    Python单元测试框架
    opencv中遍历图片数据的两种方法
    hsv 与 hsi 颜色空间
    OpenCV资料
    Linux下查看文件和文件夹大小
    The run destination iPhone 5.0 Simulator is not valid for running the scheme 'MyApp'
    OpenCV函数学习之cvLUT
    Linux中find常见用法示例
  • 原文地址:https://www.cnblogs.com/demiao/p/11760883.html
Copyright © 2020-2023  润新知