当前位置:网站首页>Descriptor implements ORM model
Descriptor implements ORM model
2022-07-06 02:51:00 【chuntian_ tester】
Catalog
1.__set__ Method : Set properties
2.__get__ Method : Access properties
3.__delete__ Method : Delete attribute
4. Descriptor implementation ORM Model :
Cannot trigger when accessing or modifying the properties of the descriptor object __setattr__ Other methods , It will only trigger __set__,__get__,__delete__ Method .
ORM Model : Class name corresponds to table name , The data row corresponding to the object , Class attribute corresponds to each field of the data row , There are several table fields , Just bind several class attributes ; Adding data to the table is creating objects , Every time an object is created , Is to add a row of data records .
ORM Functions of the framework :
1. Establish correspondence between model classes and tables , It allows us to operate the database in an object-oriented way .
2. According to the design of the model class to generate tables in the database .
3. Through convenient configuration, the database can be switched .
MySql Common data types :
1. Integers :int,bit
2. decimal :decimal(decimal Represents a floating point number ,decimal(5,2) Indicates total 5 digit , Decimal share 2 position )
3. character string :varchar( Variable length ),char( Immutable length )
4. Date time :date,time,datetime
5. Enumeration type :enum
Model cases :
"""
django Of ORM The model field
BooleanField: Boolean fields ,True or False
CharField(max_length= Maximum length ): character string , Parameters max_length Represents the maximum number of characters
IntegerField: Integers
"""
class TestReport(BaseTable):
class Meat:
verbose_name = ' Test report '
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__ Method : Set properties
"""
As long as a class appears :
__get__(self,instance,owner)
__set__(self,instance,value)
__delete__(self,instance)
__set_name__(self,owner,name)
Any of the methods in , This class is not an ordinary class ,
Should be called :
Descriptor class ( Apply to ORM In the model )
"""
class Field(object):
"""
As long as any of the following methods appear in a class , This class is a descriptor class
"""
def __get__(self, instance, owner):
pass
def __set__(self, instance, value):
print('---set--- Method triggered ')
def __delete__(self, instance):
pass
class Model(object):
attr = Field() # attr Is a descriptor object , Cannot trigger when modifying __setattr__ Other methods ,
# Only those inside the descriptor class can be triggered __set__ Method
if __name__ == '__main__':
m = Model()
m.attr = 666 # Try to modify attr attribute
print(m.attr)
# Output :
---set - -- Method triggered
None
class Field(object):
"""
As long as any of the following methods appear in a class , This class is a descriptor class
"""
def __get__(self, instance, owner):
pass
def __set__(self, instance, value):
"""
:param instance: Modified object
:param value: Modified value
:return:
"""
print('---set--- Method triggered ')
self.value = value
print(self) # <__main__.Field object at 0x7fecc01f8a30>
print(instance) # <__main__.Model object at 0x7fecc01f8a00>
print(value) # 666
def __delete__(self, instance):
pass
class Model(object):
attr = Field() # attr Is a descriptor object , Cannot trigger when modifying __setattr__ Other methods ,
# Only those inside the descriptor class can be triggered __set__ Method
if __name__ == '__main__':
m = Model()
print(m) # <__main__.Model object at 0x7fecc01f8a00>, And instance identical
m.attr = 666 # Try to modify attr attribute
2.__get__ Method : Access properties
"""
As long as a class appears :
__get__(self,instance,owner)
__set__(self,instance,value)
__delete__(self,instance)
__set_name__(self,owner,name)
Any of the methods in , This class is not an ordinary class ,
Should be called :
Descriptor class ( Apply to ORM In the model )
"""
class Field(object):
"""
As long as any of the following methods appear in a class , This class is a descriptor class
"""
def __get__(self, instance, owner):
print('---get--- Method triggered ')
def __set__(self, instance, value):
"""
:param instance: Modified object
:param value: Modified value
:return:
"""
print('---set--- Method triggered ')
self.value = value
def __delete__(self, instance):
pass
class Model(object):
attr = Field() # attr Is a descriptor object , Cannot trigger when modifying __setattr__ Other methods ,
# Only those inside the descriptor class can be triggered __set__ Method
if __name__ == '__main__':
m = Model()
m.attr = 666 # Try to modify attr attribute
print(m.attr)
# Output :
---set - -- Method triggered
---get - -- Method triggered
None
"""
As long as a class appears :
__get__(self,instance,owner)
__set__(self,instance,value)
__delete__(self,instance)
__set_name__(self,owner,name)
Any of the methods in , This class is not an ordinary class ,
Should be called :
Descriptor class ( Apply to ORM In the model )
"""
class Field(object):
"""
As long as any of the following methods appear in a class , This class is a descriptor class
"""
def __get__(self, instance, owner):
print('---get--- Method triggered ')
print(instance) # <__main__.Model object at 0x7f80b81a09d0>
print(owner) # <class '__main__.Model'>
return self.value
def __set__(self, instance, value):
"""
:param instance: Modified object
:param value: Modified value
:return:
"""
print('---set--- Method triggered ')
self.value = value
def __delete__(self, instance):
pass
class Model(object):
attr = Field() # attr Is a descriptor object , Cannot trigger when modifying __setattr__ Other methods ,
# Only those inside the descriptor class can be triggered __set__ Method
if __name__ == '__main__':
m = Model()
m.attr = 666 # Try to modify attr attribute
print(m.attr) # 666
# Output :
---set - -- Method triggered
---get - -- Method triggered
< __main__.Model object at 0x7f80b81a09d0 >
< class '__main__.Model'>
666
3.__delete__ Method : Delete attribute
"""
As long as a class appears :
__get__(self,instance,owner)
__set__(self,instance,value)
__delete__(self,instance)
__set_name__(self,owner,name)
Any of the methods in , This class is not an ordinary class ,
Should be called :
Descriptor class ( Apply to ORM In the model )
"""
class Field(object):
"""
As long as any of the following methods appear in a class , This class is a descriptor class
"""
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
"""
:param instance: Modified object
:param value: Modified value
:return:
"""
print('---set--- Method triggered ')
self.value = value
def __delete__(self, instance):
print('---delete--- Method triggered ')
class Model(object):
attr = Field() # attr Is a descriptor object , Cannot trigger when modifying __setattr__ Other methods ,
# Only those inside the descriptor class can be triggered __set__ Method
if __name__ == '__main__':
m = Model()
m.attr = 666 # Try to modify attr attribute
del m.attr # ---delete--- Method triggered
print(m.attr) # None
# Output :
---set - -- Method triggered
---delete - -- Method triggered
666
"""
As long as a class appears :
__get__(self,instance,owner)
__set__(self,instance,value)
__delete__(self,instance)
__set_name__(self,owner,name)
Any of the methods in , This class is not an ordinary class ,
Should be called :
Descriptor class ( Apply to ORM In the model )
"""
class Field(object):
"""
As long as any of the following methods appear in a class , This class is a descriptor class
"""
def __get__(self, instance, owner):
print('---get--- Method triggered ')
print(instance) # <__main__.Model object at 0x7f80b81a09d0>
print(owner) # <class '__main__.Model'>
return self.value
def __set__(self, instance, value):
"""
:param instance: Modified object
:param value: Modified value
:return:
"""
print('---set--- Method triggered ')
self.value = value
def __delete__(self, instance):
print('---delete--- Method triggered ')
print(instance) # <__main__.Model object at 0x7ff61806a160>
self.value = None
class Model(object):
attr = Field() # attr Is a descriptor object , Cannot trigger when modifying __setattr__ Other methods ,
# Only those inside the descriptor class can be triggered __set__ Method
if __name__ == '__main__':
m = Model()
m.attr = 666 # Try to modify attr attribute
del m.attr # ---delete--- Method triggered
print(m.attr) # None
# Output :
---set - -- Method triggered
---delete - -- Method triggered
< __main__.Model object at 0x7ff61806a160 >
---get - -- Method triggered
< __main__.Model object at 0x7ff61806a160 >
<class '__main__.Model'>
None
4. Descriptor implementation ORM Model :
"""
Through the descriptor ORM Model
"""
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):
# First, judge whether it is empty
if value is not None:
# Then judge whether it is a string
if isinstance(value, str):
# Then judge whether the length meets the requirements
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 = None
class IntegerField(object):
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
# First, judge whether it is empty
if value is not None:
# Then judge whether it is an integer 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 = None
class UserModel(object):
# Define the model class of user information
name = CharField(max_length=20) # Definition :name Can only be assigned as a string
pwd = CharField(max_length=40)
age = IntegerField() # Definition :age Can only be assigned as an integer
if __name__ == '__main__':
user = UserModel()
user.name = " Springfield "
print(user.name) # Output : Springfield
user.age = 130
print(user.age) # Output : 130
user.pwd = 'wsdgdgdrgerdsfs Way van der Sar sends Arthur fisaffa sfa fda fsdf sdf fg'
print(user.pwd) # Output : TypeError: length need less than 40
边栏推荐
- Which ecology is better, such as Mi family, graffiti, hilink, zhiting, etc? Analysis of five mainstream smart brands
- Detailed use of dbutils # yyds dry goods inventory #
- [ruoyi] set theme style
- Fault analysis | analysis of an example of MySQL running out of host memory
- Classic interview question [gem pirate]
- Httprunnermanager installation (III) - configuring myql Database & initialization data under Linux
- 解决:AttributeError: ‘str‘ object has no attribute ‘decode‘
- #PAT#day10
- [ruoyi] ztree custom icon (iconskin attribute)
- Briefly describe the implementation principle of redis cluster
猜你喜欢

【Kubernetes 系列】一文学会Kubernetes Service安全的暴露应用

codeforces每日5題(均1700)-第六天
![[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 24](/img/2e/b1f348ee6abaef24b439944acf36d8.jpg)
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 24

A doctor's 22 years in Huawei

Looking at the trend of sequence modeling of recommended systems in 2022 from the top paper

Software design principles

Codeworks 5 questions per day (1700 average) - day 6

C # create self host webservice

RobotFramework入门(一)简要介绍及使用

Fault analysis | analysis of an example of MySQL running out of host memory
随机推荐
Huawei, H3C, Cisco command comparison, mind map form from the basic, switching, routing three directions [transferred from wechat official account network technology alliance station]
C language - Blue Bridge Cup - promised score
A doctor's 22 years in Huawei
有没有完全自主的国产化数据库技术
Misc (eternal night), the preliminary competition of the innovation practice competition of the National College Students' information security competition
Thinking on Architecture Design (under continuous updating)
[unity3d] GUI control
Déduisez la question d'aujourd'hui - 729. Mon emploi du temps I
Summary of Bible story reading
【Kubernetes 系列】一文學會Kubernetes Service安全的暴露應用
How to accurately identify master data?
CSP numeric sort
【若依(ruoyi)】设置主题样式
1. Dynamic parameters of function: *args, **kwargs
MySQL winter vacation self-study 2022 11 (9)
2.13 simulation summary
Briefly describe the implementation principle of redis cluster
主数据管理(MDM)的成熟度
【Unity3D】GUI控件
How does yyds dry inventory deal with repeated messages in the consumption process?