在不同的表中有许多字段(10+),它们的逻辑需要封装在类型实现中。例如:字符串的上限
import sqlalchemy as sa
class UpperString(sa.String):
class comparator_factory(sa.String.Comparator):
def new_sql_operator(self, value: str):
...
# override sql operator
def match(self, value: str, **kw):
...
def bind_processor(self, dialect):
"""Transform values on db store and query filter parameter on request"""
def process(value):
if value is not None:
value = value.upper()
return value
return process
Base = declarative_base(metadata=metadata)
class Name(Base):
__tablename__ = 'name'
name = sa.Column('name', UpperString)
desc = sa.Column('desc', UpperString)
如何在现场比较操作期间实施价值评估
n = Name(name='name') # new object
assert n.name == 'Name'
n = Name(name='NAME') # object returning from session.query(Name).filter_by(name='name').one()
assert n.name == 'Name'
与帮助中描述的类似
class CaseInsensitiveName(Comparator):
...
class Name(Base):
...
@hybrid_property
def name(self):
return CaseInsensitiveName(self._name)
@name.setter
def name(self, value):
self._name = value.upper()
。。。但是没有为每个字段和/或模型创建getter/setter
也许代码不是干净的,而是枯燥的(自定义类型继承的简单实现)和工作
在decorator中实现处理启动器
在自定义类型类中,您只需要实现一个数据转换器
创建一个类型类。 重新分配
field
->_field
,对于完全自动创建属性,它不起作用。在setattr
之后,类型从InstrumentedAttribute
变为propertyProxy
。因此,模型类中的列应命名为_field
,创建的属性将被命名为field
动态创建属性
…关于我们在现场的活动
相关问题 更多 >
编程相关推荐