创建一个包含4个类的烧瓶模型,这些类包含一个1:M连接和一个涉及User类的M:M连接

问题描述 投票:0回答:1

我是Flask的新手。我正在尝试为本地社区组创建一个Flask应用程序,他们可以在其中添加评论并组织活动或支持。我已经创建了登录系统(使用在线资源),并且已经安装了flask-admin,因此有传入消息的概述。

我想限制对管理面板的访问,以便只有管理员用户才能看到所有帖子/消息。一些帖子可能是机密的。

为此,我认为使用basic-auth会很好。我研究了烧瓶角色的数据模型,以便可以分配管理员角色和“其余”角色。 (我只想要一个管理员用户),然后继续前进,并创建了我认为是合理的模型,其中用户类通过userroles类具有1:M的posts类和M:M的角色类


from datetime import datetime
from flaskblog import db, login_manager
from flaskblog import app
from flask_login import UserMixin
from flaskblog import routes
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from sqlalchemy.orm import relationship
admin = Admin(app, name='Dashboard')

@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))

class UserRoles(db.Model):
__tablename__ = 'user_roles'
id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))


class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
password = db.Column(db.String(60), nullable=False)

def __repr__(self):
return f"User('{self.username}', '{self.email}', '{self.image_file}')"


class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
date_related = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
user = relationship("User")

def __repr__(self):
return f"Post('{self.title}', '{self.date_posted},', '{self.date_related},')"

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

admin.add_view(ModelView(User, db.session))
admin.add_view(ModelView(Post, db.session))

我已经被困了好几天试图使它起作用。我已经研究了许多使其工作的不同方法,但是我一直都想出同样的错误消息。有任何想法吗?我会完全吠错树吗?

sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class User->user'. Original exception was: Could not determine join condition between parent/child tables on relationship User.roles - there are no foreign keys linking these tables via secondary table 'user_roles'.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify 'primaryjoin' and 'secondaryjoin' expressions.
python flask flask-sqlalchemy flask-login flask-admin
1个回答
0
投票

虽然这不是很关键,但我的建议是使角色成为用户的属性,而不是相反。因此,您将UserRoles更新为:

class UserRoles(db.Model):
  __tablename__ = 'user_roles'
  id = db.Column(db.Integer(), primary_key=True)
  user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
  role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))

并且用户为:

class User(db.Model, UserMixin):
  __tablename__ = 'users'
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(20), unique=True, nullable=False)
  email = db.Column(db.String(120), unique=True, nullable=False)
  image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
  password = db.Column(db.String(60), nullable=False)
  roles = relationship("UserRoles")

并且角色为:

class Role(db.Model):
  __tablename__ = 'role'
  id = db.Column(db.Integer(), primary_key=True, db.ForeignKey(User.id))
  name = db.Column(db.String(50), unique=True)

通过这种方式调用User对象时,可以通过调用“ roles”属性并遍历列表来访问其所具有的角色列表。

我认为应该解决未找到FK的问题。如果没有,请告诉我修改后的堆栈跟踪是什么。

© www.soinside.com 2019 - 2024. All rights reserved.