zoukankan      html  css  js  c++  java
  • python ORM 模块peewee(三): Model的建立

    首先,需要理清一下python数据与数据库数据是怎么对应的:

    • Model类:表
    • Field类:表上的列的类型
    • Model实例:表上的一行数据

    1. Model Class主要描述的是数据表以及其继承的顺序

    这里主要是需要对Model类中的Meta类的定义规范进行小结:

    1. 当Meta类建立后,不应该通过mymodel.Meta来进行访问,而应该使用mymodel._meta, 这是一个ModelOption类的实例, 可以通过它获取model和Meta的一些属性
    2. Meta的可用属性有:

      除了db_tabletable_alias之外,其他的字段均可以被继承
      可以看到,peewee的主键,索引和其他约束均可以在meta中定义。
    3. 主键的定义
    class mymodel1(Model):
        name = CharField(max_length=200, primary_key=True) #将该字段设为主键
    
    class mymodel2(Model):
        name = CharField(max_length=200)
        Meta:
            # 如果要不使用主键
            primary_key = False
    
    class mymodel3(Model):
        blog = ForeignKeyField(Blog)
        tag = ForeignKeyField(Tag)
    
        class Meta:
            primary_key = CompositeKey('blog', 'tag') # primary_key实际上是CompositeKey的一个实例
    

    非整型的主键
    当主键为非auto_increment时,插入数据调用save()会出错,应该调用save(force_insert=True)

    1. 添加索引
      单列索引
      多列索引

    2. Field Class主要描述python数据类型与数据库数据类型的对应关系和数据表之间的关系(外键,多对多)

    Filed在peewee.py中有基本数据类型的定义
    # 初始化函数,各个字段的默认值
    def __init__(self, null=False, index=False, unique=False,
                     verbose_name=None, help_text=None, db_column=None,
                     default=None, choices=None, primary_key=False, sequence=None,
                     constraints=None, schema=None)
    

    在playhouse.fields中定义的额外字段

    包括

        PasswordField
        ManyToManyField
        CompressedField
        PickledField
        AESEncryptedField
    

    然而peewee中并不推荐使用这些Field, 例如ManyToManyField,完全可以用一个含两个外键的关系表来维护,ManyToMany关系在ORM中实际上也正是这样来实现的,并且使用这种方式可以描述更加复杂的关系。

    自定义field字段
    # 1. 定义MyField类
    class MyField(Field):
        # Field的标签
        db_field = 'my'
        
        # 返回数据库类型的值
        def db_value(value):
            pass
    
        # 返回python类型的值
        def python_value(value):
            pass
    
    # 2. 将自定义Field子类与数据表中的列关联,有两种方法:
    #     1. 创建数据库时,给fields字段赋值
    db = MySQLDatabase('my_db', fields={'my': 'my'})
    #     2. 调用register_fields函数
    db.register_fields({'my':'my'})
    
  • 相关阅读:
    5.User Interface/Custom Components
    5.User Interface/Styles and Themes
    5.User Interface/Accessibility
    5.User Interface/Drag and Drop
    5.User Interface/Notifications
    5.User Interface/Dialogs
    Menu综合运用
    5.User Interface/ActionBar
    5.User Interface/Menu
    5.User Interface/Input Controls
  • 原文地址:https://www.cnblogs.com/noway-neway/p/5275138.html
Copyright © 2011-2022 走看看