Python 如何覆盖";塞特;在皮维区?

Python 如何覆盖";塞特;在皮维区?,python,enums,setter,peewee,Python,Enums,Setter,Peewee,给定以下代码,我想修改EnumField,这样我就可以将字符串传递到MyClass构造函数中,并立即将它们自动粘贴到enum。我想重写“setter”,但在peewee的代码中找不到它 from enum import Enum from peewee import CharField, Model class EnumField(CharField): "Custom field to support enums" def __init__(self, enum, **k

给定以下代码,我想修改
EnumField
,这样我就可以将字符串传递到
MyClass
构造函数中,并立即将它们自动粘贴到enum。我想重写“setter”,但在peewee的代码中找不到它

from enum import Enum
from peewee import CharField, Model


class EnumField(CharField):
    "Custom field to support enums"

    def __init__(self, enum, **kwargs):
        super(EnumField, self).__init__(**kwargs)
        self.enum = enum

    def db_value(self, value):
        if isinstance(value, Enum):
            return str(value.name)  # convert enum to str
        elif isinstance(value, basestring):
            return value
        return None

    def python_value(self, value):
        if value:
            return self.enum[value]  # convert str to enum
        return None

    def clone_base(self, **kwargs):
        return super(EnumField, self).clone_base(enum=self.enum, **kwargs)


class FooEnum(Enum):
    FOO = "foo"
    BAR = "bar"


class MyClass(Model):
    field1 = EnumField(FooEnum)


my_class = MyClass(field1='foo')
type(my_class.field1) == FooEnum  # False, it's str but I would like it to be autocasted

my_class.save()
my_class = MyClass.get()
type(my_class.field1) == FooEnum  # True
根据,您缺少的方法似乎是
强制

强制(价值)

默认情况下,db_值和python_值都使用此方法。您通常可以通过实现这一点而逃脱惩罚

Parameters:  value – arbitrary data from app or backend
Return type: python data type
我将使
强制
python\u值
相同:

def python_value(self, value):
    if value:
        return self.enum[value]  # convert str to enum
    return None
coerce = python_value
根据,您缺少的方法似乎是
强制

强制(价值)

默认情况下,db_值和python_值都使用此方法。您通常可以通过实现这一点而逃脱惩罚

Parameters:  value – arbitrary data from app or backend
Return type: python data type
我将使
强制
python\u值
相同:

def python_value(self, value):
    if value:
        return self.enum[value]  # convert str to enum
    return None
coerce = python_value

看起来很有希望,但在对象初始化(s|z)时没有为我调用强制/python_值:-(看起来很有希望,但在对象初始化时没有为我调用强制/python|u值:-(