文章目錄
- 11.3.17 class UUIDField
- 11.3.18 class BinaryUUIDField
- 11.3.19 class DateTimeField
- 11.3.20 class DateField
- 11.3.21 class TimeField
- 11.3.22 class TimestampField
- 11.3.23 class IPField
- 11.3.24 class BooleanField
- 11.3.25 class BareField
- 11.3.26 class ForeignKeyField
- 11.3.27 class DeferredForeignKey
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)