0
点赞
收藏
分享

微信扫一扫

为CentOs配置静态IP

茗越 2023-06-18 阅读 95

文章目录

七、模型和字段

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的自增整数主键字段。

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

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

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)

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

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

相关推荐

0 条评论