python - 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'))
我是新来的,所以请让我知道如何改进我的问题:) 任何帮助都将不胜感激。
解决方案
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()
推荐阅读
- java - 如何按最多用户位置的顺序显示我的列表(RecyclerView)?
- node.js - 检查 MFA 是否为使用 rest api 的用户启用
- spring - HATEOAS:如何通过 URI 发布新的子关联
- javafx - JavaFX - 如何使轴刻度线标签居中
- c++11 - 访问二维数组(整数和字符数组)
- git - 不小心创建了不同大小写的重复分支(Master),如何将其移回master?
- javascript - Vue 可拖动树节点从一棵树到另一棵树
- electron.net - ElectronNET 使用 dot net core 项目生成 32 位 exe 或其他自定义版本
- python - 如何处理 UFuncTypeError?
- c# - 如何检查最大数量是否大于1