首页 > 解决方案 > Flask-SQLAlchemy 附加不适用于多对多关系

问题描述

我正在尝试使用 append 方法添加到引用表中,以实现类 User 和类 App 之间的多对多关系(在整个代码中也称为“加号”)。这个想法是会有很多用户使用单个应用程序和单个用户使用的许多应用程序,所以我认为多对多关系是合适的。我能够获得一个有效的用户对象和一个有效的 app/plus 对象,但是当我使用 plus.append(user) 时,什么也没有发生。我没有收到错误,并且没有任何内容添加到参考表中。我猜我没有正确建立关系?

我尝试过的事情:

参考表定义:

plusses = db.Table(
'plusses',
db.Column('plus_id', db.Integer, db.ForeignKey('app.id')),
db.Column('user_id', db.Integer, db.ForeignKey('user.id')))

“用户”类的定义

class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
about_me = db.Column(db.String(140))
last_seen = db.Column(db.DateTime, default=datetime.utcnow)

“应用”类的定义:

class App(db.Model):
id = db.Column(db.Integer, primary_key=True)
icon = db.Column(db.String(140))
link = db.Column(db.String(140))
name = db.Column(db.String(140))
args = db.Column(db.Text())
description = db.Column(db.String(220))

pluses_user = db.relationship(
        'User', secondary=plusses,backref=db.backref('plusses', lazy='dynamic'), lazy='dynamic')


def __repr__(self):
    return '<App {}>'.format(self.body)

def getApp(self, name):
    return App.query.filter_by(name=name).first()
    # if app is None:
        # Create app here if

def add_plus(self, user):
    if not self.has_plus(user):
        self.pluses_user.append(user)

def remove_plus(self, user):
    if self.has_plus(user):
        self.pluses_user.remove(user)

def has_plus(self, user):
    return self.pluses_user.filter(
        plusses.c.plus_id == user.id).count() > 0

使用该功能的路线:

@bp.route('/add/<plusname>')
@login_required
def add_plus(plusname):
  plus=App.query.filter_by(name=plusname).first()
  if plus is None:
      flash('App not found')
      return redirect(url_for('main.index'))
  plus.add_plus(current_user)
  return redirect(url_for('main.apps'))

我是新来的,所以请让我知道如何改进我的问题:) 任何帮助都将不胜感激。

标签: pythonsqlalchemymany-to-many

解决方案


db.session.commit()我可以通过添加到我的 add_plus 和 remove_plus 函数来解决这个问题。它们现在看起来像这样:

def add_plus(self, user):
    if not self.has_plus(user):
        self.pluses_user.append(user)
        db.session.commit()

def remove_plus(self, user):
    if self.has_plus(user):
        self.pluses_user.remove(user)
        db.session.commit()

推荐阅读