Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy多对多关系参数_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy多对多关系参数

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

我使用SQLAlchemy ORM获取属于某个用户的角色,但得到以下错误

无法确定上的父/子表之间的联接条件 关系AppRole.users-存在多个外键路径 通过辅助表“app\u user\u role”链接表。指定 “foreign_keys”参数,提供以下列的列表: 应计为包含来自的外键引用 将辅助表添加到每个父表和子表

这些表格的定义如下:

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,它应该是另一侧关系的名称,而不是表的名称。