zoukankan      html  css  js  c++  java
  • MTV与MVC/多对多表三种创建方式

    import settings
    import importlib
    
    
    def send_all(content):
        for path_str in settings.NOTIFY_LIST:  #'notify.email.Email'
            module_path,class_name = path_str.rsplit('.',maxsplit=1)
            # module_path = 'notify.email'  class_name = 'Email'
            # 1 利用字符串导入模块
            module = importlib.import_module(module_path)  # from notify import email
            # 2 利用反射获取类名
            cls = getattr(module,class_name)  # Email、QQ、Wechat
            # 3 生成类的对象
            obj = cls()
            # 4 利用鸭子类型直接调用send方法
            obj.send(content)
    # 全自动:利用orm自动帮我们创建第三张关系表
        class Book(models.Model):
        name = models.CharField(max_length=32)
        authors = models.ManyToManyField(to='Author')
        class Author(models.Model):
        name = models.CharField(max_length=32)
        """
        优点:代码不需要你写 非常的方便 还支持orm提供操作第三张关系表的方法...
        不足之处:第三张关系表的扩展性极差(没有办法额外添加字段...)
        """
    # 纯手动
        class Book(models.Model):
        name = models.CharField(max_length=32)
        
        class Author(models.Model):
        name = models.CharField(max_length=32)
      
      class Book2Author(models.Model):
        book_id = models.ForeignKey(to='Book')
        author_id = models.ForeignKey(to='Author')
      '''
      优点:第三张表完全取决于你自己进行额外的扩展
      不足之处:需要写的代码较多,不能够再使用orm提供的简单的方法
      不建议你用该方式
      '''
    
    # 半自动
    class Book(models.Model):
        name = models.CharField(max_length=32)
        authors = models.ManyToManyField(to='Author',
                                         through='Book2Author',
                                         through_fields=('book','author')
                                         )
    class Author(models.Model):
        name = models.CharField(max_length=32)
        # 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')
    
    """
    through_fields字段先后顺序
        判断的本质:
            通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
        你也可以简化判断
            当前表是谁 就把对应的关联字段放前面
            
            
    半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法
    """
    
    # 总结:你需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动(写代码要给自己留一条后路)
  • 相关阅读:
    二维数组重复合并 并计算
    处理formdata传递的json数据
    thinkphp lock 锁 的使用和例子
    docker 更新后 和wsl2直接集成
    ubuntu apt 换阿里镜像源
    使用phpstorm将本地代码实时自动同步到远程服务器
    notepad++ markdown主题
    【Git】pull遇到错误:error: Your local changes to the following files would be overwritten by merge:
    hyperf 安装扩展 protobuf
    bt[宝塔]安装redis
  • 原文地址:https://www.cnblogs.com/mayrain/p/13068906.html
Copyright © 2011-2022 走看看