首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制一对多关系中多个的数量

限制一对多关系中多个的数量
EN

Stack Overflow用户
提问于 2014-10-26 09:18:51
回答 1查看 479关注 0票数 3

我正在尝试使用Flask-SQLAlchemy来限制一对多中的“多”的数量。我希望每个“盲”行只允许3个或更少的“鼠标”(鼠标)。

这是我的基本设置。

代码语言:javascript
复制
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__ ),但这导致了错误:

代码语言:javascript
复制
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' ()

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2014-10-26 16:24:05

在处理了这个问题几个小时之后,我开始查看sqlalchemy事件文档。这是我能想到的最好的办法了。

代码语言:javascript
复制
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的第四个鼠标。大获成功!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26568894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档