当前位置:网站首页>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
边栏推荐
- Bigder: I felt good about the 34/100 interview, but I didn't receive the admission
- Trends in DDoS Attacks
- 【 kubernets series】 a Literature Study on the Safe exposure Applications of kubernets Service
- Large scale DDoS attacks take Myanmar offline
- C language - Blue Bridge Cup - promised score
- Codeworks 5 questions per day (1700 average) - day 6
- Fault analysis | analysis of an example of MySQL running out of host memory
- 【Kubernetes 系列】一文学会Kubernetes Service安全的暴露应用
- RobotFramework入门(二)appUI自动化之app启动
- Maturity of master data management (MDM)
猜你喜欢
Httprunnermanager installation (III) - configuring myql Database & initialization data under Linux
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 20
Codeworks 5 questions per day (1700 average) - day 6
[pointer training - eight questions]
淘宝焦点图布局实战
深度解析链动2+1模式,颠覆传统卖货思维?
Reverse repackaging of wechat applet
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 15
Shell script updates stored procedure to database
ERA5再分析资料下载攻略
随机推荐
Introduction to robotframework (III) Baidu search of webui automation
Network Security Learning - Web vulnerabilities (Part 1)
[Digital IC manual tearing code] Verilog asynchronous reset synchronous release | topic | principle | design | simulation
js 正则过滤和增加富文本中图片前缀
纯Qt版中国象棋:实现双人对战、人机对战及网络对战
MySQL winter vacation self-study 2022 11 (9)
RobotFramework入门(三)WebUI自动化之百度搜索
Misc (eternal night), the preliminary competition of the innovation practice competition of the National College Students' information security competition
Force buckle 146 LRU cache
How to accurately identify master data?
[Yu Yue education] basic reference materials of digital electronic technology of Xi'an University of Technology
PMP每日一练 | 考试不迷路-7.5
Déduisez la question d'aujourd'hui - 729. Mon emploi du temps I
如何精准识别主数据?
Rust language -- iterators and closures
张丽俊:穿透不确定性要靠四个“不变”
JS events (add, delete) and delegates
Summary of Bible story reading
【若依(ruoyi)】设置主题样式
Function knowledge points