怎么使用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:整数"""classTestReport(BaseTable):classMeat: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模型中)"""classField(object):"""只要一个类中出现了以下任意一个方法,这个类就是一个描述器类"""def__get__(self,instance,owner):passdef__set__(self,instance,value):print('---set---方法被触发了')def__delete__(self,instance):passclassModel(object):attr=Field()#attr是一个描述器对象,修改时无法触发__setattr__等方法,#只能触发描述器类内部的__set__方法if__name__=='__main__':m=Model()m.attr=666#尝试修改attr属性print(m.attr)#输出:---set---方法被触发了None
classField(object):"""只要一个类中出现了以下任意一个方法,这个类就是一个描述器类"""def__get__(self,instance,owner):passdef__set__(self,instance,value):""":paraminstance:修改的对象:paramvalue:修改的值:return:"""print('---set---方法被触发了')self.value=valueprint(self)#<__main__.Fieldobjectat0x7fecc01f8a30>print(instance)#<__main__.Modelobjectat0x7fecc01f8a00>print(value)#666def__delete__(self,instance):passclassModel(object):attr=Field()#attr是一个描述器对象,修改时无法触发__setattr__等方法,#只能触发描述器类内部的__set__方法if__name__=='__main__':m=Model()print(m)#<__main__.Modelobjectat0x7fecc01f8a00>,与instance相同m.attr=666#尝试修改attr属性2.__get__方法:访问属性
"""只要一个类中出现了:__get__(self,instance,owner)__set__(self,instance,value)__delete__(self,instance)__set_name__(self,owner,name)中的任意一个方法,这个类就不是一个普通的类了,应被称为:描述器类(应用在ORM模型中)"""classField(object):"""只要一个类中出现了以下任意一个方法,这个类就是一个描述器类"""def__get__(self,instance,owner):print('---get---方法被触发了')def__set__(self,instance,value):""":paraminstance:修改的对象:paramvalue:修改的值:return:"""print('---set---方法被触发了')self.value=valuedef__delete__(self,instance):passclassModel(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模型中)"""classField(object):"""只要一个类中出现了以下任意一个方法,这个类就是一个描述器类"""def__get__(self,instance,owner):print('---get---方法被触发了')print(instance)#<__main__.Modelobjectat0x7f80b81a09d0>print(owner)#<class'__main__.Model'>returnself.valuedef__set__(self,instance,value):""":paraminstance:修改的对象:paramvalue:修改的值:return:"""print('---set---方法被触发了')self.value=valuedef__delete__(self,instance):passclassModel(object):attr=Field()#attr是一个描述器对象,修改时无法触发__setattr__等方法,#只能触发描述器类内部的__set__方法if__name__=='__main__':m=Model()m.attr=666#尝试修改attr属性print(m.attr)#666#输出:---set---方法被触发了---get---方法被触发了<__main__.Modelobjectat0x7f80b81a09d0><class'__main__.Model'>6663.__delete__方法:删除属性
"""只要一个类中出现了:__get__(self,instance,owner)__set__(self,instance,value)__delete__(self,instance)__set_name__(self,owner,name)中的任意一个方法,这个类就不是一个普通的类了,应被称为:描述器类(应用在ORM模型中)"""classField(object):"""只要一个类中出现了以下任意一个方法,这个类就是一个描述器类"""def__get__(self,instance,owner):returnself.valuedef__set__(self,instance,value):""":paraminstance:修改的对象:paramvalue:修改的值:return:"""print('---set---方法被触发了')self.value=valuedef__delete__(self,instance):print('---delete---方法被触发了')classModel(object):attr=Field()#attr是一个描述器对象,修改时无法触发__setattr__等方法,#只能触发描述器类内部的__set__方法if__name__=='__main__':m=Model()m.attr=666#尝试修改attr属性delm.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模型中)"""classField(object):"""只要一个类中出现了以下任意一个方法,这个类就是一个描述器类"""def__get__(self,instance,owner):print('---get---方法被触发了')print(instance)#<__main__.Modelobjectat0x7f80b81a09d0>print(owner)#<class'__main__.Model'>returnself.valuedef__set__(self,instance,value):""":paraminstance:修改的对象:paramvalue:修改的值:return:"""print('---set---方法被触发了')self.value=valuedef__delete__(self,instance):print('---delete---方法被触发了')print(instance)#<__main__.Modelobjectat0x7ff61806a160>self.value=NoneclassModel(object):attr=Field()#attr是一个描述器对象,修改时无法触发__setattr__等方法,#只能触发描述器类内部的__set__方法if__name__=='__main__':m=Model()m.attr=666#尝试修改attr属性delm.attr#---delete---方法被触发了print(m.attr)#None#输出:---set---方法被触发了---delete---方法被触发了<__main__.Modelobjectat0x7ff61806a160>---get---方法被触发了<__main__.Modelobjectat0x7ff61806a160><class'__main__.Model'>None4.描述器实现ORM模型:
"""通过描述器实现ORM模型"""classCharField(object):def__init__(self,max_length=20):self.max_length=max_lengthdef__get__(self,instance,owner):returnself.valuedef__set__(self,instance,value):#首先判断是否为空ifvalueisnotNone:#再判断是否是字符串ifisinstance(value,str):#再判断长度是否符合要求iflen(value)<=self.max_length:self.value=valueelse:raiseTypeError('lengthneedlessthan{}'.format(self.max_length))else:raiseTypeError('needastr')else:raiseTypeError("cannotbeNone")def__delete__(self,instance):self.value=NoneclassIntegerField(object):def__get__(self,instance,owner):returnself.valuedef__set__(self,instance,value):#首先判断是否为空ifvalueisnotNone:#再判断是否是整数intifisinstance(value,int):self.value=valueelse:raiseTypeError('needaint')else:raiseTypeError("cannotbeNone")def__delete__(self,instance):self.value=NoneclassUserModel(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=130print(user.age)#输出:130user.pwd='wsdgdgdrgerdsfs方式范德萨发阿瑟费萨法sfafdafsdfsdffg'print(user.pwd)#输出:TypeError:lengthneedlessthan40
读到这里,这篇“怎么使用Python描述器实现ORM模型”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。