【Python百日进阶-Web开发-Peewee】Day250 - Peewee 字段类型等

文章介绍了PeeweeORM中Model和Field的概念,展示了如何创建数据库连接和模型类。字段通过Field实例映射到数据库列,包括不同类型的字段如CharField、DateTimeField和ForeignKeyField,以及它们的初始化参数和默认值。文章还强调了外键如何表示模型间的关系,并提到了数据库默认值和动态默认值的设定方法。
摘要由CSDN通过智能技术生成

七、模型和字段

Model类、Field实例和模型实例都映射到数据库概念:

事物对应…
Model classDatabase table
Field instanceColumn on a table
Model instanceRow in a database table
以下代码显示了定义数据库连接和模型类的典型方式。
import datetime
from peewee import *

db = SqliteDatabase('my_app.db')

class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    username = CharField(unique=True)

class Tweet(BaseModel):
    user = ForeignKeyField(User, backref='tweets')
    message = TextField()
    created_date = DateTimeField(default=datetime.datetime.now)
    is_published = BooleanField(default=True)
  1. 创建一个Database.
db = SqliteDatabase('my_app.db')

该db对象将用于管理与 Sqlite 数据库的连接。在此示例中,我们使用的是SqliteDatabase,但您也可以使用其他数据库引擎之一。

  1. 创建一个指定我们的数据库的基本模型类。
class BaseModel(Model):
    class Meta:
        database = db

定义一个建立数据库连接的基本模型类是一种很好的做法。这使您的代码干燥,因为您不必为后续模型指定数据库。

模型配置保存在一个名为Meta. 这个约定是从 Django 借来的。元 配置传递给子类,所以我们项目的模型都将继承 BaseModel。您可以使用 Model.Meta 配置许多不同的属性。

  1. 定义一个模型类。
class User(BaseModel):
    username = CharField(unique=True)

模型定义使用在 SQLAlchemy 或 Django 等其他流行的 ORM 中看到的声明式样式。请注意,我们正在扩展BaseModel类,因此User模型将继承数据库连接。

我们已经明确定义了一个带有唯一约束的用户名列。因为我们没有指定主键,peewee 会自动添加一个名为 id的自增整数主键字段。

笔记

如果您想在现有数据库中开始使用 peewee,您可以使用pwiz,一个模型生成器来自动生成模型定义。

7.1 字段

该类Field用于描述 Model属性到数据库列的映射。每种字段类型都有对应的SQL存储类(即varchar、int),python数据类型与底层存储之间的转换是透明处理的。

创建Model类时,字段被定义为类属性。这对于 django 框架的用户来说应该很熟悉。这是一个例子:

class User(Model):
    username = CharField()
    join_date = DateTimeField()
    about_me = TextField()

在上面的示例中,由于没有使用 初始化任何字段,因此 primary_key=True将自动创建一个自动递增的主键并命名为“id”。Peewee 用于AutoField表示一个自动递增的整数主键,这意味着primary_key=True.

有一种特殊类型的字段 ,ForeignKeyField它允许您以直观的方式表示模型之间的外键关系:

class Message(Model):
    user = ForeignKeyField(User, backref='messages')
    body = TextField()
    send_date = DateTimeField(default=datetime.datetime.now)

这允许您编写如下代码:


>>> print(some_message.user.username)
Some User

>>> for message in some_user.messages:
...     print(message.body)
some message
another message
yet another message

笔记

有关模型之间的外键、连接和关系的深入讨论,请参阅关系和连接文档。

有关字段的完整文档,请参阅字段 API 说明

7.1.1 字段类型表

字段类型SqlitePostgreSQLMySQL
AutoFieldintegerserialinteger
BigAutoFieldintegerbigserialbigint
IntegerFieldintegerintegerinteger
BigIntegerFieldintegerbigintbigint
SmallIntegerFieldintegersmallintsmallint
IdentityFieldnot supportedint identitynot supported
FloatFieldrealrealreal
DoubleFieldrealdouble precisiondouble precision
DecimalFielddecimalnumericnumeric
CharFieldvarcharvarcharvarchar
FixedCharFieldcharcharchar
TextFieldtexttexttext
BlobFieldblobbyteablob
BitFieldintegerbigintbigint
BigBitFieldblobbyteablob
UUIDFieldtextuuidvarchar(40)
BinaryUUIDFieldblobbyteavarbinary(16)
DateTimeFielddatetimetimestampdatetime
DateFielddatedatedate
TimeFieldtimetimetime
TimestampFieldintegerintegerinteger
IPFieldintegerbigintbigint
BooleanFieldintegerbooleanbool
BareFielduntypednot supportednot supported
ForeignKeyFieldintegerintegerinteger

笔记

在上表中没有看到您要查找的字段?创建自定义字段类型并将它们与您的模型一起使用很容易。

  • 创建自定义字段
  • Database,特别是fields参数。

7.1.2 字段初始化参数

所有字段类型接受的参数及其默认值:

  • null = False– 允许空值
  • index = False– 在该列上创建索引
  • unique = False– 在此列上创建唯一索引。另请参阅添加复合索引。
  • column_name = None– 显式指定数据库中的列名。
  • default = None- 任何值或可调用用作未初始化模型的默认值
  • primary_key = False– 表的主键
  • constraints = None- 一个或多个约束,例如[Check(‘price > 0’)]
  • sequence = None– 序列名称(如果后端支持)
  • collation = None– 用于排序字段/索引的排序规则
  • unindexed = False- 指示虚拟表上的字段应该是无索引的(仅限 SQLite)
  • choices = None– 包含 2 个元组的可选迭代value,display
  • help_text = None– 表示该字段的任何有用文本的字符串
  • verbose_name = None– 表示该字段的“用户友好”名称的字符串
  • index_type = None– 指定自定义索引类型,例如,对于 Postgres,您可以指定 a’BRIN’或’GIN’索引。

7.1.3 有些字段采用特殊参数……

字段类型特殊参数
CharFieldmax_length
FixedCharFieldmax_length
DateTimeFieldformats
DateFieldformats
TimeFieldformats
TimestampFieldresolution,utc
DecimalFieldmax_digits, decimal_places, auto_round, rounding
ForeignKeyFieldmodel, field, backref, on_delete, on_update, deferrable lazy_load
BareFieldadapt

笔记

两者default和choices都可以在数据库级别分别实现为DEFAULT和CHECK
CONSTRAINT,但是任何应用程序更改都需要模式更改。因此,default纯粹在 python
中实现,choices未经验证,仅用于元数据目的。

要添加数据库(服务器端)约束,请使用constraints 参数。

7.1.3 默认字段值

Peewee 可以在创建对象时为字段提供默认值。例如,要将IntegerField默认值设为 0 而不是NULL,您可以使用默认值声明该字段:

class Message(Model):
    context = TextField()
    read_count = IntegerField(default=0)

在某些情况下,默认值是动态的可能是有意义的。一个常见的场景是使用当前日期和时间。Peewee 允许您在这些情况下指定一个函数,该函数的返回值将在创建对象时使用。注意我们只提供函数,我们实际上并没有调用 它:

class Message(Model):
    context = TextField()
    timestamp = DateTimeField(default=datetime.datetime.now)

笔记

如果您使用的字段接受可变类型(list、dict等),并希望提供默认值,则最好将默认值包装在一个简单的函数中,这样多个模型实例就不会共享一个引用相同的底层对象:

def house_defaults():
return {‘beds’: 0, ‘baths’: 0}

class House(Model):
number = TextField()
street = TextField()
attributes = JSONField(default=house_defaults)

数据库还可以为字段提供默认值。虽然 peewee 没有明确提供用于设置服务器端默认值的 API,但您可以使用该constraints参数来指定服务器默认值:

class Message(Model):
    context = TextField()
    timestamp = DateTimeField(constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')])

笔记

请记住:使用default参数时,值由 Peewee 设置,而不是实际表和列定义的一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岳涛@心馨电脑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值