怎么使用Python描述器实现ORM模型
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本文小编为大家详细介绍"怎么使用Python描述器实现ORM模型",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么使用Python描述器实现ORM模型"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
千家信息网最后更新 2025年01月19日怎么使用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 - --方法被触发了 None
class 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安全错误
数据库的锁怎样保障安全
dell电脑从服务器安装系统
外包软件开发 免增值税吗
数据库 是文件
如何把网上的数据库弄下来
网卡驱动器进不去服务器
软件开发v模型包括
项目如何部署到服务器
马克数据库高级会员领取规则
网络安全警报教程
首都网络安全日哪年设立的
数据库在哪查询
h2 数据库驱动
网络技术辩论会
三维管道软件开发
2018年网络安全考研国家线
哪些软件开发平台好
vb链接远程数据库
网络安全产品毛利润
旅游软件开发方案模板下载
网络安全大神道哥面试
自动外汇软件开发
中国网络安全部长
什么数据库不包括论文全文
网络安全管理头像
天yi网络安全
阳江自主可控软件开发销售厂
网络安全家长留言大全
什么是数据库安全的地道保障
学习软件开发的培训班
网络安全技能大赛网上报名