【Python百日进阶-Web开发-Peewee】Day287 - Peewee 的扩展(六)字段等

本文详细介绍了DjangoPlayhouseORM中的CompressedField、PickleField、HybridAttributes(包括hybrid_method和hybrid_property)以及Key/ValueStore模块的KeyValue类,展示了如何在Python和SQL级别混合操作,以及高效的数据存储和检索方法。

13.10 字段

这些字段可以在playhouse.fields模块中找到。

class CompressedField
class CompressedField([compression_level=6[, algorithm='zlib'[, **kwargs]]])

参数:

  • compression_level ( int ) – 0 到 9 之间的值。
  • algorithm( str ) – 要么’zlib’要么’bz2’。
    使用指定算法存储压缩数据。该字段扩展 BlobField,透明地存储数据库中数据的压缩表示。
class PickleField
class PickleField

通过透明地酸洗和取消酸洗存储在字段中的数据来存储任意 Python 数据。该字段扩展BlobField. 如果该 cPickle模块可用,它将被使用。

13.11 混合属性 Hybrid Attributes

混合属性封装了在 Python 和SQL 级别运行的功能。混合属性的想法来自 SQLAlchemy 中的同名功能。考虑以下示例:

class Interval(Model):
    start = IntegerField()
    end = IntegerField()

    @hybrid_property
    def length(self):
        return self.end - self.start

    @hybrid_method
    def contains(self, point):
        return (self.start <= point) & (point < self.end)

混合属性的名称来自于length 属性的行为会根据是通过 Interval类还是Interval实例访问而有所不同。

如果通过实例访问,那么它的行为与您预期的一样。

但是,如果通过Interval.length类属性访问,则长度计算将表示为 SQL 表达式。例如:

query = Interval.select().where(Interval.length > 5)

此查询将等效于以下 SQL:

SELECT "t1"."id", "t1"."start", "t1"."end"
FROM "interval" AS t1
WHERE (("t1"."end" - "t1"."start") > 5)

该playhouse.hybrid模块还包含一个装饰器,用于实现可以接受参数的混合方法。与混合属性一样,当通过模型实例访问时,函数会按原样正常执行。但是,当在类上调用混合方法时,它将生成一个 SQL 表达式。

例子:

query = Interval.select().where(Interval.contains(2))

此查询等效于以下 SQL:

SELECT "t1"."id", "t1"."start", "t1"."end"
FROM "interval" AS t1
WHERE (("t1"."start" <= 2) AND (2 < "t1"."end"))

对于 Python 实现与 SQL 实现略有不同的情况,还有一个额外的 API。让我们为模型添加一个radius方法Interval。因为该方法计算的是绝对值,所以我们将 Pythonabs()函数用于实例部分,将fn.ABS()SQL 函数用于类部分。

class Interval(Model):
    start = IntegerField()
    end = IntegerField()

    @hybrid_property
    def length(self):
        return self.end - self.start

    @hybrid_property
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

岳涛@泰山医院

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

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

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

打赏作者

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

抵扣说明:

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

余额充值