您的位置:首页 > 编程语言 > Python开发

python ORM 模块peewee(三): Model的建立

2017-06-10 17:04 197 查看
首先,需要理清一下python数据与数据库数据是怎么对应的:

Model类:表

Field类:表上的列的类型

Model实例:表上的一行数据

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

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

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

Meta的可用属性有:



除了
db_table
table_alias
之外,其他的字段均可以被继承

可以看到,peewee的主键,索引和其他约束均可以在meta中定义。

主键的定义

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)


添加索引

单列索引

多列索引

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'})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: