SQLAlchemy关联代理阻止重复条目

2024-10-02 04:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Association Proxy来建立一个间接的多对多关系,其中Submission可以有多个Role,而Role可以与多个{}相关联。请注意,我还使用了flask-sqlalchemy。在

class Role(db.Model):
    __tablename__ = 'role'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)

    def __init__(self, name):
        self.name = name

class Submission(db.Model):
    __tablename__ = 'submission'
    id = db.Column(db.Integer, primary_key=True)

    submission_to_role = relationship("SubmissionToRole", cascade="all, delete-orphan")
    roles = association_proxy('submission_to_role', 'role')


class SubmissionToRole(db.Model):
    __tablename__ = 'submission_to_role'

    submission_id = db.Column(db.Integer, db.ForeignKey('submission.id', ondelete='CASCADE'), primary_key=True)
    role_id = db.Column(db.Integer, db.ForeignKey('role.id', ondelete='CASCADE'), primary_key=True)
    submission = relationship(Submission)
    role = relationship(Role)

    def __init__(self, role):
        self.role = role

我需要这样的行为:

^{pr2}$

但是,当我关联一个已经关联的Role时,SQLAlchemy创建了一个重复的Association对象。在


我怎样才能达到我想要的行为?我为Submission编写了一个函数来绕过它

def associate_role(self, role):
        assoc_model = SubmissionToRole.query.filter(
            SubmissionToRole.submission_id == self.id
        ).filter(
            SubmissionToRole.role_id == role.id
        ).first()
        if not assoc_model:
            self.roles.append(role)

但是想要更干净、更容易重复使用的东西。我能用SQLAlchemy的原生元素吗?在


Tags: keynameselfidtruesubmissiondbcolumn

热门问题