当前位置:网站首页>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

原网站

版权声明
本文为[chuntian_ tester]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202132348590117.html