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

这篇具有很好参考价值的文章主要介绍了【Python百日进阶-Web开发-Peewee】Day250 - Peewee 字段类型等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

七、模型和字段

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

事物 对应…
Model class Database table
Field instance Column on a table
Model instance Row 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 字段类型表

字段类型 Sqlite PostgreSQL MySQL
AutoField integer serial integer
BigAutoField integer bigserial bigint
IntegerField integer integer integer
BigIntegerField integer bigint bigint
SmallIntegerField integer smallint smallint
IdentityField not supported int identity not supported
FloatField real real real
DoubleField real double precision double precision
DecimalField decimal numeric numeric
CharField varchar varchar varchar
FixedCharField char char char
TextField text text text
BlobField blob bytea blob
BitField integer bigint bigint
BigBitField blob bytea blob
UUIDField text uuid varchar(40)
BinaryUUIDField blob bytea varbinary(16)
DateTimeField datetime timestamp datetime
DateField date date date
TimeField time time time
TimestampField integer integer integer
IPField integer bigint bigint
BooleanField integer boolean bool
BareField untyped not supported not supported
ForeignKeyField integer integer integer

笔记

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

  • 创建自定义字段
  • 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 有些字段采用特殊参数……

字段类型 特殊参数
CharField max_length
FixedCharField max_length
DateTimeField formats
DateField formats
TimeField formats
TimestampField resolution,utc
DecimalField max_digits, decimal_places, auto_round, rounding
ForeignKeyField model, field, backref, on_delete, on_update, deferrable lazy_load
BareField adapt

笔记

两者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 设置,而不是实际表和列定义的一部分。文章来源地址https://www.toymoban.com/news/detail-489138.html

到了这里,关于【Python百日进阶-Web开发-Peewee】Day250 - Peewee 字段类型等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Flask Web开发三:数据表的字段增加和删除

    在实际的开发中,数据表中的字段的增加和删除是很正常的操作,在运营的不断提需求下,这个修改的频率是很高的,那么在flask中如何进行字段的增加和删除呢?下面我来给大家讲讲 使用数据库迁移工具(如 Flask-Migrate等)创建一个新的迁移脚本。这个脚本将包含对数据库

    2024年02月09日
    浏览(48)
  • Python Web开发记录 Day1:HTML

    名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN) (一个喜欢古诗词和编程的Coder😊) 一、HTML 1、前端引入和HTML标签 ①前端引入 安装fllask 咱们的网站与别人的不一样: Flask框架为了让咱们写标签方便,支持将字符串写入到文件里面

    2024年02月21日
    浏览(48)
  • Python Web开发记录 Day7:Django(Web框架) part 1

    名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN) (一个喜欢古诗词和编程的Coder😊) 在当今迅速发展的互联网时代,开发高效、安全且可扩展的网站变得越来越重要。Python语言因其简洁的语法和强大的功能而广受欢迎,而Django则是P

    2024年03月11日
    浏览(67)
  • 百日刷题计划 ———— DAY1

    给出平面坐标上不在一条直线上三个点坐标 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_1,y_1),(x_2,y_2),(x_3,y_3) ( x 1 ​ , y 1 ​ ) , ( x 2 ​ , y 2 ​ ) , ( x 3 ​ , y 3 ​ ) ,坐标值是实数,且绝对值不超过 100.00,求围成的三角形周长。保留两位小数。 对于平面上的两个点 ( x 1 , y 1 ) , ( x 2

    2024年02月15日
    浏览(36)
  • 【100天精通python】Day47:python网络编程_Web开发:web服务器,前端基础以及静态服务器

    目录 1  网络编程与web编程 1.1 网络编程 1.2 web编程  1.3 前后端交互的基本原理/

    2024年02月11日
    浏览(52)
  • 【ArcGIS遇上Python】ArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据为例)

    基于土地利用数据,根据用地类型名称,批量筛选出不同类型的用地,生成不同类型的shp数据,以类型名称命名。 ArcGIS Python根据字段属性批量筛选生成shp图层

    2023年04月09日
    浏览(50)
  • 百日筑基篇——python爬虫学习(一)

    百日筑基篇——python爬虫学习(一) 随着学习的深入,有关从各种不同的数据库中以及互联网上的海量信息,如何有选择性的爬取我们所需的数据以方便我们的数据分析工作,爬虫的学习是必要的。 Python爬虫是指使用Python编程语言编写的程序,通过模拟浏览器行为从网页中

    2024年02月13日
    浏览(52)
  • python 基础篇 day 1 初识变量和数据类型

    变量作用——用于存储和表示数据。 通过定义和使用变量,我们可以在程序执行过程中动态地保存和修改数据。 变量的作用包括但不限于以下几个方面: 存储数据 :变量可以用来 存储各种类型的数据 ,包括数字、字符串、布尔值等。 数据传递 :变量可以 作为参数传递

    2024年02月09日
    浏览(42)
  • 【Python】进阶学习:判断一个对象是否是NoneType类型

    【Python】进阶学习:判断一个对象是否是NoneType类型 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多关于深度学习、

    2024年04月28日
    浏览(40)
  • 2023年web前端开发之JavaScript进阶(一)

    接上篇博客进行学习,通俗易懂,详细 博客地址: 2023年web前端开发之JavaScript基础(五)基础完结_努力的小周同学的博客-CSDN博客 学习 作用域 、变量提升、 闭包 等语言特征,加深对 JavaScript 的理解,掌握变量赋值、函数声明的简洁语法, 降低代码的冗余度 。 理解作用域对程序

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包