Python SQLAlchemy基于字典对约束建模

Python SQLAlchemy基于字典对约束建模,python,sqlalchemy,Python,Sqlalchemy,我有一张这样的桌子: 还有一本字典: 现在我需要一个约束,它允许示例中的颜色属性只能是对应列表中的一个项 哪种方法最聪明 (我用setter方法找到的唯一方法:)您可以使用事件侦听器: colors = { 'Lion' : ['gold', 'orange'], 'Tiger' : ['blackorange', 'whiteblue'] } class Sample(Base): __tablename__ = 'sample' i

我有一张这样的桌子:

还有一本字典:

现在我需要一个约束,它允许示例中的颜色属性只能是对应列表中的一个项

哪种方法最聪明


(我用setter方法找到的唯一方法:)

您可以使用事件侦听器:

colors = { 'Lion' : ['gold', 'orange'],
           'Tiger' : ['blackorange', 'whiteblue']
         }
class Sample(Base):
    __tablename__ = 'sample'
    id = Column(Integer, primary_key=True)
    type = Column(Enum(u'Lion', u'Tiger', name='type'))
    color = Column(Enum('gold', 'orange', 'blackorange', 'whiteblue', name='color'))

from sqlalchemy import event

def my_check_sample_listener(mapper, connection, target):
    assert target.color in colors[target.type]

event.listen(Sample, 'before_insert', my_check_sample_listener)
event.listen(Sample, 'before_update', my_check_sample_listener)

sample = Sample(type='Tiger', color='orange')
session.add(sample)
session.commit() # Fails

sample = Sample(type='Lion', color='orange')
session.add(sample)
session.commit() # OK

sample.type = 'Tiger'
sample.color = 'whiteblue'
session.commit() # OK

sample.color = 'orange'
session.commit() # Fails
读完这一章后,我发现还有很多改进的余地,谢谢!
colors = { 'Lion' : ['gold', 'orange'],
           'Tiger' : ['blackorange', 'whiteblue']
         }
colors = { 'Lion' : ['gold', 'orange'],
           'Tiger' : ['blackorange', 'whiteblue']
         }
class Sample(Base):
    __tablename__ = 'sample'
    id = Column(Integer, primary_key=True)
    type = Column(Enum(u'Lion', u'Tiger', name='type'))
    color = Column(Enum('gold', 'orange', 'blackorange', 'whiteblue', name='color'))

from sqlalchemy import event

def my_check_sample_listener(mapper, connection, target):
    assert target.color in colors[target.type]

event.listen(Sample, 'before_insert', my_check_sample_listener)
event.listen(Sample, 'before_update', my_check_sample_listener)

sample = Sample(type='Tiger', color='orange')
session.add(sample)
session.commit() # Fails

sample = Sample(type='Lion', color='orange')
session.add(sample)
session.commit() # OK

sample.type = 'Tiger'
sample.color = 'whiteblue'
session.commit() # OK

sample.color = 'orange'
session.commit() # Fails