Python SQLAlchemy多对多关系参数
我使用SQLAlchemy ORM获取属于某个用户的角色,但得到以下错误 无法确定上的父/子表之间的联接条件 关系AppRole.users-存在多个外键路径 通过辅助表“app\u user\u role”链接表。指定 “foreign_keys”参数,提供以下列的列表: 应计为包含来自的外键引用 将辅助表添加到每个父表和子表 这些表格的定义如下:Python SQLAlchemy多对多关系参数,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我使用SQLAlchemy ORM获取属于某个用户的角色,但得到以下错误 无法确定上的父/子表之间的联接条件 关系AppRole.users-存在多个外键路径 通过辅助表“app\u user\u role”链接表。指定 “foreign_keys”参数,提供以下列的列表: 应计为包含来自的外键引用 将辅助表添加到每个父表和子表 这些表格的定义如下: class AppUserRole(Base_Write): __tablename__ = 'app_user_role' id
class AppUserRole(Base_Write):
__tablename__ = 'app_user_role'
id = Column(Integer, primary_key=True)
created_at = Column(DateTime, server_default=text('NOW()'), nullable=False)
created_by = Column(Integer, ForeignKey('app_user.id'), nullable=False)
is_deleted = Column(Boolean, server_default='0', nullable=False)
date_deleted = Column(DateTime)
deleted_by = Column(Integer, ForeignKey('app_user.id'))
user_id = Column(Integer, ForeignKey('app_user.id'), nullable=False)
role_id = Column(Integer, ForeignKey('app_role.id'), nullable=False)
date_assigned = Column(DateTime, nullable=False)
class AppRole(Base_Write):
__tablename__ = 'app_role'
id = Column(Integer, primary_key=True)
created_at = Column(DateTime, server_default=text('NOW()'), nullable=False)
created_by = Column(Integer)
is_deleted = Column(Boolean, server_default='0', nullable=False)
date_deleted = Column(DateTime)
deleted_by = Column(Integer, ForeignKey('app_user.id'))
role_classification_id = Column(Integer, ForeignKey('app_role_classification.id'), nullable=False)
role_code = Column(String(10), nullable=False, unique=True)
role_name = Column(String(30), nullable=False)
users = relationship("AppUser", secondary="app_user_role", back_populates="app_role")
class AppUser(Base_Write):
__tablename__ = 'app_user'
id = Column(Integer, primary_key=True)
created_at = Column(DateTime, server_default=text('NOW()'), nullable=False)
created_by = Column(Integer, ForeignKey('app_user.id'), nullable=False)
is_deleted = Column(Boolean, server_default='0', nullable=False)
date_deleted = Column(DateTime)
deleted_by = Column(Integer, ForeignKey('app_user.id'))
username = Column(String(50), nullable=False, unique=True)
roles = relationship("AppRole", secondary="app_user_role", back_populates="app_user")
正在运行的查询是:
for app_user in session.query(AppUser).\
filter(AppUser.is_deleted == False).filter(AppUser.id == user_id):
#print the names of the roles assigned
print(app_user.roles.role_name)
问题是,我还有其他表,在这些表中,我定义了其他多对多关系参数,所有的一切都正常工作。尽管我一直都会犯这样的错误。这里还有其他类似的问题,但尝试了不同的建议,但运气不佳。我已经试着去错误的建议,并使用我以前的问题,但即使把外键选项似乎不工作,虽然我必须承认我真的在猜测它的位置
SQLAlchemy version==1.0.12,Postgresql 9.5正如错误消息所说,您有多个外键链接到
AppUser
,即AppUserRole.user id
,AppUserRole.deleted\u by
,以及AppUserRole.created\u by
,因此,您需要指定外键
参数:
class AppRole(Base):
...
users = relationship("AppUser", secondary="app_user_role",
foreign_keys=[AppUserRole.user_id, AppUserRole.role_id],
back_populates="roles")
class AppUser(Base):
...
roles = relationship("AppRole", secondary="app_user_role",
foreign_keys=[AppUserRole.user_id, AppUserRole.role_id],
back_populates="users")
这管用!谢谢然而,我认为
back\u populates
通常指向表/类/模型
,其中定义了关系。在这种情况下,我会认为AppRole应该是back\u populates=“app\u role”
,AppUser表应该是back\u populates=“app\u user”
?@lukik No,它应该是另一侧关系的名称,而不是表的名称。