文章目录
11.3.17 class UUIDField
class UUIDField
用于存储uuid.UUID对象的字段类。使用 Postgres,底层列的数据类型将是UUID。由于 SQLite 和 MySQL 没有原生 UUID 类型,因此 UUID 被存储为VARCHAR。
11.3.18 class BinaryUUIDField
class BinaryUUIDField
uuid.UUID用于以 16 字节有效存储对象的字段类。使用数据库的BLOB数据类型(或MySQL 中的VARBINARY,或Postgres 中的BYTEA)。
11.3.19 class DateTimeField
class DateTimeField([formats=None[, **kwargs]])
参数: 格式( list ) – 将字符串强制为日期时间时使用的格式字符串列表。
用于存储datetime.datetime对象的字段类。
接受一个特殊参数formats,其中包含日期时间可以编码的格式列表(对于不支持本机日期时间数据类型的数据库)。默认支持的格式是:
'%Y-%m-%d %H:%M:%S.%f' # year-month-day hour-minute-second.microsecond
'%Y-%m-%d %H:%M:%S' # year-month-day hour-minute-second
'%Y-%m-%d' # year-month-day
笔记
SQLite 没有本地日期时间数据类型,因此日期时间存储为字符串。这由 Peewee 透明地处理,但如果您有预先存在的数据,则应确保将其存储为 其他受支持的格式或其中一种格式。YYYY-mm-dd HH:MM:SS
year
在查询中引用存储在列中的值的年份。
Blog.select().where(Blog.pub_date.year == 2018)
month
在查询中引用存储在列中的值的月份。
day
在查询中引用存储在列中的值的日期。
hour
在查询中引用存储在列中的值的小时数。
minute
在查询中引用存储在列中的值的分钟。
second
在查询中引用存储在列中的第二个值。
to_timestamp()
返回特定于数据库的函数调用的方法,该函数调用将允许您将给定的日期时间值用作数字时间戳。这有时可以以兼容的方式简化日期数学等任务。
例子:
# Find all events that are exactly 1 hour long.
query = (Event
.select()
.where((Event.start.to_timestamp() + 3600) ==
Event.stop.to_timestamp())
.order_by(Event.start))
truncate(date_part)
参数: date_part( str ) – 年、月、日、小时、分钟或秒。
返回: 将日期/时间截断为给定分辨率的表达式节点。
将列中的值截断为给定部分。例如,此方法可用于查找给定月份内的所有行。
11.3.20 class DateField
class DateField([formats=None[, **kwargs]])
参数: formats( list ) – 将字符串强制为日期时使用的格式字符串列表。
用于存储datetime.date对象的字段类。
接受一个特殊参数formats,其中包含日期时间可以编码的格式列表(对于不支持本机日期数据类型的数据库)。默认支持的格式是:
'%Y-%m-%d' # year-month-day
'%Y-%m-%d %H:%M:%S' # year-month-day hour-minute-second
'%Y-%m-%d %H:%M:%S.%f' # year-month-day hour-minute-second.microsecond
笔记
如果传入的值与格式不匹配,则按原样返回。
year
在查询中引用存储在列中的值的年份。
Person.select().where(Person.dob.year == 1983)
month
在查询中引用存储在列中的值的月份。
day
在查询中引用存储在列中的值的日期。
to_timestamp()
见DateTimeField.to_timestamp()。
truncate(date_part)
见DateTimeField.truncate()。请注意,只有年、月和日对 有意义DateField。
11.3.21 class TimeField
class TimeField([formats=None[, **kwargs]])
参数: 格式( list ) – 将字符串强制为时间时使用的格式字符串列表。
用于存储datetime.time对象的字段类(不是timedelta)。
接受一个特殊参数formats,其中包含日期时间可以编码的格式列表(对于不支持本机时间数据类型的数据库)。默认支持的格式是:
'%H:%M:%S.%f' # hour:minute:second.microsecond
'%H:%M:%S' # hour:minute:second
'%H:%M' # hour:minute
'%Y-%m-%d %H:%M:%S.%f' # year-month-day hour-minute-second.microsecond
'%Y-%m-%d %H:%M:%S' # year-month-day hour-minute-second
笔记
如果传入的值与格式不匹配,则按原样返回。
hour
在查询中引用存储在列中的值的小时数。
evening_events = Event.select().where(Event.time.hour > 17)
minute
在查询中引用存储在列中的值的分钟。
second
在查询中引用存储在列中的第二个值。
11.3.22 class TimestampField
class TimestampField([resolution=1[, UTC=False[, **kwargs]]])
参数:
- resolution- 可以提供为 10 的幂,或作为指示要存储多少小数位的指数。
- utc ( bool ) – 将时间戳视为 UTC。
用于将日期时间存储为整数时间戳的字段类。亚秒级分辨率通过乘以 10 的幂得到一个整数来支持。
如果resolution参数为0 或 1,则使用第二个分辨率存储时间戳。2和之间的分辨率6被视为小数位数,例如resolution=3对应于毫秒。或者,可以将小数作为 10 的倍数提供,这样resolution=10将存储 1/10 秒的分辨率。
该resolution参数可以是 0-6或10、100 等,最高可达 1000000(对于微秒分辨率)。这允许亚秒级精度,同时仍使用IntegerFieldfor 存储。默认为第二分辨率。
还接受一个布尔参数utc,用于指示时间戳是否应为 UTC。默认为False。
最后,该字段default是当前时间戳。如果你不想要这种行为,那么显式传入default=None.
11.3.23 class IPField
class IPField
用于有效存储 IPv4 地址的字段类(作为整数)。
11.3.24 class BooleanField
class BooleanField
用于存储布尔值的字段类。
11.3.25 class BareField
class BareField([coerce=None[, **kwargs]])
参数: 胁迫– 用于将原始值转换为特定格式的可选函数。
未指定数据类型的字段类(仅限 SQLite)。
由于不强制使用数据类型,因此您可以声明没有任何 数据类型的字段。SQLite 虚拟表使用元列或无类型列也很常见,因此对于这些情况,您也可能希望使用无类型字段。
接受一个特殊coerce参数,一个函数,它接受来自数据库的值并将其转换为适当的 Python 类型。
11.3.26 class ForeignKeyField
class ForeignKeyField(model[, field=None[, backref=None[, on_delete=None[, on_update=None[, deferrable=None[, object_id_name=None[, lazy_load=True[, constraint_name=None[, **kwargs]]]]]]]]])
参数:
- model ( Model ) – 要引用的模型或字符串“self”(如果声明自引用外键)。
- field ( Field ) – 要引用model的字段(默认为主键)。
- backref ( str ) – 反向引用的访问器名称,或“+”以禁用反向引用访问器。
- on_delete ( str ) – ON DELETE 操作,例如’CASCADE’…
- on_update ( str ) – ON UPDATE 动作。
- deferrable ( str ) – 控制何时强制执行约束,例如.‘INITIALLY DEFERRED’
- object_id_name ( str ) – 对象 ID 访问器的名称。
- lazy_load ( bool ) – 在访问外键字段属性时获取相关对象(如果尚未加载)。如果禁用,访问外键字段将返回存储在外键列中的值。
- constraint_name ( str ) - (可选)用于外键约束的名称。
用于存储外键的字段类。
model (Model) – Model to reference or the string ‘self’ if declaring a self-referential foreign key.
field (Field) – Field to reference on model (default is primary key).
backref (str) – Accessor name for back-reference, or “+” to disable the back-reference accessor.
on_delete (str) – ON DELETE action, e.g. ‘CASCADE’…
on_update (str) – ON UPDATE action.
deferrable (str) – Control when constraint is enforced, e.g. ‘INITIALLY DEFERRED’.
object_id_name (str) – Name for object-id accessor.
lazy_load (bool) – Fetch the related object when the foreign-key field attribute is accessed (if it was not already loaded). If this is disabled, accessing the foreign-key field will return the value stored in the foreign-key column.
constraint_name (str) – (optional) name to use for foreign-key constraint.
class User(Model):
name = TextField()
class Tweet(Model):
user = ForeignKeyField(User, backref='tweets')
content = TextField()
# "user" attribute 根据博文查作者charlie
>>> some_tweet.user
<User: charlie>
# "tweets" backref attribute
>>> for tweet in charlie.tweets: # 查询作者为charlie的所有博文
... print(tweet.content)
Some tweet
Another tweet
Yet another tweet
有关模型之间的外键、连接和关系的深入讨论,请参阅关系和连接。
笔记
外键没有特定field_type的,因为它们将根据与其相关的模型上的主键类型来获取其字段类型。
笔记
如果您手动指定 a field,则该字段必须是主键或具有唯一约束。
笔记
注意 SQLite 中的外键。默认情况下,ON DELETE 没有任何效果,这会对您的数据库完整性产生令人惊讶的(通常是不必要的)影响。即使您不指定 on_delete,这也会影响您,因为默认的 ON DELETE 行为(在不修改数据的情况下失败)不会发生,并且您的数据可以静默重新链接。最安全的做法是指定 实例化的时间 。pragmas={‘foreign_keys’: 1}SqliteDatabase
Take care with foreign keys in SQLite. By default, ON DELETE has no effect, which can have surprising (and usually unwanted) effects on your database integrity. This can affect you even if you don’t specify on_delete, since the default ON DELETE behaviour (to fail without modifying your data) does not happen, and your data can be silently relinked. The safest thing to do is to specify pragmas={‘foreign_keys’: 1} when you instantiate SqliteDatabase.
11.3.27 class DeferredForeignKey
class DeferredForeignKey( rel_model_name[, **kwargs])
参数: rel_model_name( str ) – 要引用的模型名称。
表示延迟外键的字段类。对于循环外键引用很有用,例如:
class Husband(Model):
name = TextField()
wife = DeferredForeignKey('Wife', deferrable='INITIALLY DEFERRED')
class Wife(Model):
name = TextField()
husband = ForeignKeyField(Husband, deferrable='INITIALLY DEFERRED')
在上面的例子中,当Wife模型被声明时,外键 Husband.wife被自动解析并变成了一个正则 ForeignKeyField。
警告
DeferredForeignKey在声明和创建模型类时解析引用。这意味着如果您向 DeferredForeignKey已经导入和创建的模型类声明 a,则延迟的外键实例将永远不会被解析。例如:
class User(Model):
username = TextField()
class Tweet(Model):
# This will never actually be resolved, because the User
# model has already been declared.
user = DeferredForeignKey('user', backref='tweets')
content = TextField()
在这种情况下,您应该使用常规 或者您可以手动解析延迟外键,如下所示:ForeignKeyField
# Tweet.user will be resolved into a ForeignKeyField:
DeferredForeignKey.resolve(User)