我正在尝试使用Flask-SQLAlchemy来限制一对多中的“多”的数量。我希望每个“盲”行只允许3个或更少的“鼠标”(鼠标)。
这是我的基本设置。
class Blind(db.Model):
__tablename__ = 'blind'
#this __table_args__ does not work
#__table_args__ = ((db.CheckConstraint('length(blind_mice <= 3)')),)
id = db.Column(db.Integer, primary_key=True)
# I want to limit the blind_mice
#relationship to a count of 3 mice per 'Blind' id
blind_mice = db.relationship('Mouse')
class Mouse(db.Model):
__tablename__ = 'mouse'
id = db.Column(db.Integer, primary_key=True)
blind_id = db.Column(db.Integer, db.ForeignKey('blind.id'))
blind = db.relationship("Blind")我尝试使用sqlalchemy中的CheckConstraint (参见上面注释掉的__table_args__ ),但这导致了错误:
sqlalchemy.exc.OperationalError: (OperationalError) no such column: blind_mice u'\nCREATE
TABLE blind (\n\tid INTEGER NOT NULL, \n\tPRIMARY KEY (id), \n\tCHECK (length(blind_mice
<= 3))\n)\n\n' ()任何帮助都是非常感谢的。
发布于 2014-10-26 16:24:05
在处理了这个问题几个小时之后,我开始查看sqlalchemy事件文档。这是我能想到的最好的办法了。
from sqlalchemy import event
from sqlalchemy.exc import IntegrityError
MAX_MICE_PER_BLIND = 3
class Blind(db.Model):
__tablename__ = 'blind'
id = db.Column(db.Integer, primary_key=True)
blind_mice = db.relationship('Mouse')
class Mouse(db.Model):
__tablename__ = 'mouse'
id = db.Column(db.Integer, primary_key=True)
blind_id = db.Column(db.Integer, db.ForeignKey('blind.id'))
blind = db.relationship("Blind")
@event.listens_for(Mouse.blind_id, 'set', retval=True)
def mice_per_blind_check(target, value, oldvalue, initiator):
if value is not None:
mice_count = Mouse.query.filter_by(blind_id=value).count()
if mice_count >= MAX_MICE_PER_BLIND:
orig = Exception('Maximum number of Mice ({}) '\
'reached for Blind.id = {}'\
.format(MAX_MICE_PER_BLIND, value))
msg = "Record Not Committed"
raise IntegrityError(msg, ';)', orig)
return value此解决方案抛出一个IntegrityError,当与Flask-Restless一起使用时,它会导致HTTP400错误请求,但不会中断Flask服务器操作。此外,此解决方案不允许存在blind_id =n的第四个鼠标。大获成功!
https://stackoverflow.com/questions/26568894
复制相似问题