peewee自定义字段 - 定义允许的值

时间:2016-08-28 19:51:23

标签: python python-3.x peewee

两种情况:

1。)我想定义一个只能取整数0,1或2的属性(val)。

class Trinary(Model):
    """val should accept the values 0, 1 or 2 only"""
    val = IntegerField()

2。)我想定义一个只能采用特定字符串的属性(val),例如[" strawberry"," peach",&#34 ;苹果"]

class Fruit(Model):
    """val should accept the values "strawberry", "peach" or "apple" only """
    val = ???

是否可以使用peewee实施这样的限制?

感谢您的帮助!

莫夫

2 个答案:

答案 0 :(得分:2)

对象IntegerField等是类,可以是子类(documentation):

类应定义db_value以从python转换为数据库, 而python_value用于反过来

class TrinaryField(IntegerField):
        def db_value(self, value):
            if value not in [0,1,2]:
                raise TypeError("Non-trinary digit")
            return super().db_field(value)  # call 

答案 1 :(得分:0)

从peewee 3.0的实际方法Adapt()中,它可以将您的类型值转换为字段类型。

假设我们的用户状态为Enum且带有UserStatus

通过这种方式,我们可以将Enum转换为int并返回

#!/usr/bin/python3
from enum import IntEnum, unique

@unique
class UserStatus(IntEnum):
    active = 0
    blocked = 1
    deleted = 2

class UserStatusField(SmallIntegerField):
    def db_value(self, status_enum_field):
        """
        Python -> DataBase
        :param value: Enum
        :return: int
        """
        if not isinstance(status_enum_field, UserStatus):
            raise TypeError("Wrong type, must be enum")
        return super().adapt(status_enum_field.value)  # call

    def python_value(self, db_val):
        """
        DataBase -> Python
        :param db_val: int
        :return: Enum
        """
        return UserStatus(db_val)