首先,需要理清一下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'})
posted on 2016-03-14 17:36  迷阳  阅读(3523)  评论(0编辑  收藏  举报