首页 > 其他分享 >使用元类实现Django的ORM

使用元类实现Django的ORM

时间:2024-03-21 13:46:04浏览次数:27  
标签:__ varchar name 30 Django 元类 ORM attrs mappings

一、ORM基本介绍

ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM。

二、实现目标

创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句

如图:

三、代码实现

class ModelMetaClass(type):

    def __new__(cls, name, bases, attrs):
        mappings = dict()
        for k, v in attrs.items():
            # 只处理类中属性值为元组的键值对
            if isinstance(v, tuple):
                mappings[k] = v

        # 处理完成后删除属性
        for k in mappings:
            attrs.pop(k)

        attrs["__mappings__"] = mappings
        attrs["__table__"] = name
        # 这里不能用type(name, bases, attrs) 直接返回创建好的类, 不会触发type的__init__方法
        return type.__new__(cls, name, bases, attrs)


class Model(metaclass=ModelMetaClass):
    # uid = ("uid", "int unsigned")
    # name = ("username", "varchar(30)")
    # email = ("email", "varchar(30)")
    # password = ("password", "varchar(30)")

    def __init__(self, **kwargs):
        # 将关键字参数添加到实例属性
        for k, v in kwargs.items():
            setattr(self, k, v)

    def save(self):
        table_name = self.__table__
        field = list()
        args = list()
        for k, v in self.__mappings__.items():
            field.append(v[0])
            arg = getattr(self, k, None)
            # ["12345","""'Michael'""","""'[email protected]'""","""'my-pwd'"""]
            if isinstance(arg, str):
                args.append("""'{}'""".format(arg))
            else:
                args.append(str(arg))

        sql = "insert into {}({}) values ({})".format(table_name, ",".join(field), ",".join(args))
        print(f"SQL语句: {sql}")


class User(Model):
    uid = ("uid", "int unsigned")
    name = ("username", "varchar(30)")
    email = ("email", "varchar(30)")
    password = ("password", "varchar(30)")


u = User(uid=12345, name="Michael", email="[email protected]", password="my-pwd")
u.save()

代码运行结果:

标签:__,varchar,name,30,Django,元类,ORM,attrs,mappings
From: https://www.cnblogs.com/cs-songbai/p/18087184

相关文章

  • C# 使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedExceptio
    ​ C#使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedException)代码:HttpListenerlistener=newHttpListener();错误:System.PlatformNotSupportedException:OperationisnotsupportedonthisplatformInSystem.Net.HttpListener..ctor()......
  • SPPSVC.EXE(Software Protection Platform Service)是Windows操作系统中的一个进程,起源
    ‪C:\Windows\System32\sppsvc.exeSPPSVC.EXE(SoftwareProtectionPlatformService)是Windows操作系统中的一个进程,起源于微软公司为了保护其软件版权而开发的软件保护服务。这个服务主要负责验证Windows的许可证信息、管理软件激活状态以及执行与软件许可证相关的任务。SPPSVC.E......
  • 基于python+django+Spark的动漫推荐可视化分析系统
    摘 要近年来,随着互联网的蓬勃发展,企事业单位对信息的管理提出了更高的要求。以传统的管理方式已无法满足现代人们的需求。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,随着各行业的不断发展,基于Spark的国漫推荐系统的建设也逐渐进入了信息化的进程。这个系统......
  • Web框架开发-Django-模板继承和静态文件配置
    一、模板继承目的:减少代码的冗余语法:123{%blockclassinfo%}{%endblock%}具体步骤:1、创建一个base.html文件2、把要显示的页面的内容写在这里面,也就是HTML要在浏览器显示的内容3、在rigth里面写一个盒子{%blockclassinfo%}{%endblock%}......
  • Web框架开发-Django-数据库表的单表查询
    一、添加表记录对于单表有两种方式方式一:12book_obj=models.Book(title="python全栈开发",price=100,publishData="2015-08-08",author='张三',publish='机械工业出版社')    book_obj.save()方式二:12#方式二:    models.Book.objec......
  • Winform程序播放视频
    需求:在Winform程序中播放视频,并且控制循环播放1、管理NuGet程序包2、搜索“Vlc”,安装“Vlc.DotNet.Forms”“VideoLAN.LibVLC.Windows”“Vlc.DotNet.Core”3、搜索“VideoLAN.LibVLC”,安装“VideoLAN.LibVLC.Windows”4、编译后会生成“Vlc.DotNet.Core.dll”、“Vlc.Dot......
  • flask-migrate迁移ORM模型
    安装依赖(C:\ProgramData\Anaconda3)C:\Users\ychen>pipinstallflask-migrateLookinginindexes:https://mirrors.aliyun.com/pypi/simple/Collectingflask-migrateDownloadinghttps://mirrors.aliyun.com/pypi/packages/93/01/587023575286236f95d2ab8a826c......
  • 在winform中如何嵌入第三方软件窗体
    合集-C#(24) 1.使用C#将几个Excel文件合并去重分类2023-11-152.C#使用SqlSugar操作MySQL数据库实现简单的增删改查2023-11-163.C#中的类和继承2023-11-174.C#中的virtual和override关键字2023-11-175.C#中的属性2023-11-206.C#winform中使用SQLite数据库2023-11-237.C#简......
  • Django一对多、多对多的增删改查
    一对多的增删改查多对多的增删改查正反向概念书和出版社,外键字段建立在书表里那由书查出版社就是正向,而出版社查书就是反向正向:外键字段在我手里,从我查你反向:外键字段不在我手里,我查你多表查询子查询(基于对象的跨表查询)select*frompublishwhere......
  • Python 数据持久层ORM框架 TorToise模块(异步)
    文章目录TortoiseORM简介TortoiseORM特性TortoiseORM安装TortoiseORM数据库支持TortoiseORM创建模型aerich迁移工具简介aerich迁移工具安装aerich迁移工具使用TrotoiseORM查询数据TrotoiseORM修改数据TrotoiseORM删除数据TrotoiseORM新增数据......