鉴于以下代码,我想以一种可以将字符串传递给EnumField
构造函数的方式修改MyClass
,并且它们会立即自动更新为枚举。我想过要覆盖" 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
答案 0 :(得分:0)
根据Peewee docs for fields,您看起来缺少的方法是coerce
:
裹胁(值)
This method is a shorthand that is used, by default, by both db_value and
python_value. You can usually get away with just implementing this.
Parameters: value – arbitrary data from app or backend
Return type: python data type
我会coerce
与python_value
相同:
def python_value(self, value):
if value:
return self.enum[value] # convert str to enum
return None
coerce = python_value