怎么使用Python描述器实现ORM模型
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,本文小编为大家详细介绍"怎么使用Python描述器实现ORM模型",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么使用Python描述器实现ORM模型"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
千家信息网最后更新 2025年11月10日怎么使用Python描述器实现ORM模型
本文小编为大家详细介绍"怎么使用Python描述器实现ORM模型",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么使用Python描述器实现ORM模型"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
访问或者修改描述器对象的属性时无法触发__setattr__等方法,只会触发描述器类内部的__set__,__get__,__delete__方法.
ORM模型:类名对应表名,对象对应的数据行,类属性对应数据行的各字段,有几个表字段,就绑定几个类属性;往表中增加数据就是创建对象,每创建一个对象,就是增加一行数据记录。
ORM框架的功能:
1.建立模型类和表之间的对应关系,允许我们通过面向对象的方式操作数据库。
2.根据设计的模型类生成数据库中的表格。
3.通过方便的配置就可以进行数据库的切换。
MySql的常用数据类型:
1.整数:int,bit
2.小数:decimal(decimal表示浮点数,decimal(5,2)表示共计5位数,小数占2位)
3.字符串:varchar(可变长度),char(不可变长度)
4.日期时间:date,time,datetime
5.枚举类型:enum
模型类案例:
"""django的ORM模型字段BooleanField: 布尔字段,True或FalseCharField(max_length=最大长度): 字符串,参数max_length表示最大字符个数IntegerField: 整数"""class TestReport(BaseTable): class Meat: verbose_name = '测试报告' db_table = "TestReport" report_name = models.CharField(max_length=40, null=False) start_at = models.CharField(max_length=40, null=True) status = models.BooleanField() testRun = models.IntegerField() successes = models.IntegerField() reports = models.TextField()
1.__set__方法:设置属性
"""只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在ORM模型中)"""class Field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): pass def __set__(self, instance, value): print('---set---方法被触发了') def __delete__(self, instance): passclass Model(object): attr = Field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法if __name__ == '__main__': m = Model() m.attr = 666 # 尝试修改attr属性 print(m.attr) # 输出: ---set - --方法被触发了 Noneclass Field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): pass def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value print(self) # <__main__.Field object at 0x7fecc01f8a30> print(instance) # <__main__.Model object at 0x7fecc01f8a00> print(value) # 666 def __delete__(self, instance): passclass Model(object): attr = Field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法if __name__ == '__main__': m = Model() print(m) # <__main__.Model object at 0x7fecc01f8a00>,与instance相同 m.attr = 666 # 尝试修改attr属性2.__get__方法:访问属性
"""只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在ORM模型中)"""class Field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): print('---get---方法被触发了') def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): passclass Model(object): attr = Field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法if __name__ == '__main__': m = Model() m.attr = 666 # 尝试修改attr属性 print(m.attr) # 输出: ---set - --方法被触发了 ---get - --方法被触发了 None"""只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在ORM模型中)"""class Field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): print('---get---方法被触发了') print(instance) # <__main__.Model object at 0x7f80b81a09d0> print(owner) # return self.value def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): passclass Model(object): attr = Field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法if __name__ == '__main__': m = Model() m.attr = 666 # 尝试修改attr属性 print(m.attr) # 666 # 输出: ---set - --方法被触发了 ---get - --方法被触发了 < __main__.Model object at 0x7f80b81a09d0 > < class '__main__.Model'> 666 3.__delete__方法:删除属性
"""只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在ORM模型中)"""class Field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): return self.value def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): print('---delete---方法被触发了')class Model(object): attr = Field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法if __name__ == '__main__': m = Model() m.attr = 666 # 尝试修改attr属性 del m.attr # ---delete---方法被触发了 print(m.attr) # None # 输出: ---set - --方法被触发了 ---delete - --方法被触发了 666"""只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在ORM模型中)"""class Field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): print('---get---方法被触发了') print(instance) # <__main__.Model object at 0x7f80b81a09d0> print(owner) # return self.value def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): print('---delete---方法被触发了') print(instance) # <__main__.Model object at 0x7ff61806a160> self.value = Noneclass Model(object): attr = Field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法if __name__ == '__main__': m = Model() m.attr = 666 # 尝试修改attr属性 del m.attr # ---delete---方法被触发了 print(m.attr) # None # 输出: ---set - --方法被触发了 ---delete - --方法被触发了 < __main__.Model object at 0x7ff61806a160 > ---get - --方法被触发了 < __main__.Model object at 0x7ff61806a160 > None 4.描述器实现ORM模型:
"""通过描述器实现ORM模型"""class CharField(object): def __init__(self,max_length=20): self.max_length = max_length def __get__(self, instance, owner): return self.value def __set__(self, instance, value): # 首先判断是否为空 if value is not None: # 再判断是否是字符串 if isinstance(value, str): # 再判断长度是否符合要求 if len(value) <= self.max_length: self.value = value else: raise TypeError('length need less than {}'.format(self.max_length)) else: raise TypeError('need a str') else: raise TypeError("can not be None") def __delete__(self, instance): self.value = Noneclass IntegerField(object): def __get__(self, instance, owner): return self.value def __set__(self, instance, value): # 首先判断是否为空 if value is not None: # 再判断是否是整数int if isinstance(value, int): self.value = value else: raise TypeError('need a int') else: raise TypeError("can not be None") def __delete__(self, instance): self.value = Noneclass UserModel(object): # 定义用户信息的模型类 name = CharField(max_length=20) # 定义:name只能赋值为字符串 pwd = CharField(max_length=40) age = IntegerField() # 定义:age只能赋值为整数if __name__ == '__main__': user = UserModel() user.name = "春田" print(user.name) # 输出: 春田 user.age = 130 print(user.age) # 输出: 130 user.pwd = 'wsdgdgdrgerdsfs方式范德萨发阿瑟费萨法 sfa fda fsdf sdf fg' print(user.pwd) # 输出: TypeError: length need less than 40读到这里,这篇"怎么使用Python描述器实现ORM模型"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
方法
模型
对象
属性
就是
数据
输出
尝试
普通
字符
应用
字段
字符串
整数
长度
数据库
文章
最大
内容
小数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
原神哔哩哔哩是什么服务器
互联网之光网宿科技
绝地求生如何联系服务器
泰拉瑞亚服务器卡
百度h5有数据库6
重庆颖逊游戏软件开发有限公司
阿里云数据库并发量
数据库修改密码教程
三星手机可以做云服务器吗
黄山明洲网络技术有限公司
大学生如何做到网络安全
我的世界服务器管理员配置
交通运输部网络安全保卫总队
外网不能访问内网服务器
你对网络安全如何看
广州市天象网络技术有限公司
网络安全常见指令
软件技术和计算机网络技术
nginx日志入数据库
关于网络安全相关股票
远程服务器口令
福建教师招聘网络技术
服务器通电启动慢
以太网使用哪种网络技术
手机软件开发书籍推荐
ipad显示服务器丢了怎么处理
苏州阿里云服务器哪里有
金蝶k3数据库实体后缀
注册表里查看db2数据库
简述IIS服务器设置方法