Python 对多对多使用关联代理时是否需要反向引用?

Python 对多对多使用关联代理时是否需要反向引用?,python,many-to-many,sqlalchemy,associations,relationship,Python,Many To Many,Sqlalchemy,Associations,Relationship,因此,使用SqlAlchemy,我在用户模型和注释模型之间创建了一个相当简单的多对多关系 users.py class UsersModel(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(50)) email = Column(String(50)) issues = relationship(IssuesMod

因此,使用SqlAlchemy,我在用户模型和注释模型之间创建了一个相当简单的多对多关系

users.py

class UsersModel(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(50))
    email = Column(String(50))
    issues = relationship(IssuesModel, backref="user")
    comments = relationship(IssueCommentsModel, backref="user")
    voted_comments = association_proxy('users_comments', 'comment')

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<Users('%s', '%s', '%s')>" % (self.id,
                                              self.username,
                                              self.email)
class UsersCommentsModel(Base):
    __tablename__ = 'users_comments'
    user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
    comment_id = Column(Integer, ForeignKey('issue_comments.id'), primary_key=True)
    vote = Column(Integer(1))

    user = relationship(UsersModel,
                        backref="users_comments")
    comment = relationship(IssueCommentsModel,
                           backref="users_comments")

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<UsersComments('%s', '%s', '%s')>" % (self.user_id,
                                                      self.comment_id,
                                                      self.vote)    
class IssueCommentsModel(Base):
    __tablename__ = 'issue_comments'

    id = Column(Integer, primary_key=True)
    body = Column(String(300))
    created = Column(DateTime)
    change_time = Column(DateTime)
    score = Column(Integer(100), default=0)
    issue_id = Column(Integer, ForeignKey('issues.id'))
    user_id = Column(Integer, ForeignKey('users.id'))
    voted_users = association_proxy('users_comments', 'user')

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<IssueComments('%s', '%s', '%s', '%s', '%s', '%s')>" % (self.id, 
                                                                        self.body, 
                                                                        self.issue, 
                                                                        self.user, 
                                                                        self.created, 
                                                                        self.change_time)
类用户模型(基本):
__tablename_uu='users'
id=列(整数,主键=True)
用户名=列(字符串(50))
电子邮件=列(字符串(50))
问题=关系(问题模型,backref=“用户”)
注释=关系(IssueCommentsModel,backref=“用户”)
投票意见=关联意见代理('用户意见','意见')
定义初始化(自我,**字段):
自我记录更新(字段)
定义报告(自我):
返回“%”(self.id,
self.username,
self.email)
用户\u评论.py

class UsersModel(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(50))
    email = Column(String(50))
    issues = relationship(IssuesModel, backref="user")
    comments = relationship(IssueCommentsModel, backref="user")
    voted_comments = association_proxy('users_comments', 'comment')

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<Users('%s', '%s', '%s')>" % (self.id,
                                              self.username,
                                              self.email)
class UsersCommentsModel(Base):
    __tablename__ = 'users_comments'
    user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
    comment_id = Column(Integer, ForeignKey('issue_comments.id'), primary_key=True)
    vote = Column(Integer(1))

    user = relationship(UsersModel,
                        backref="users_comments")
    comment = relationship(IssueCommentsModel,
                           backref="users_comments")

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<UsersComments('%s', '%s', '%s')>" % (self.user_id,
                                                      self.comment_id,
                                                      self.vote)    
class IssueCommentsModel(Base):
    __tablename__ = 'issue_comments'

    id = Column(Integer, primary_key=True)
    body = Column(String(300))
    created = Column(DateTime)
    change_time = Column(DateTime)
    score = Column(Integer(100), default=0)
    issue_id = Column(Integer, ForeignKey('issues.id'))
    user_id = Column(Integer, ForeignKey('users.id'))
    voted_users = association_proxy('users_comments', 'user')

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<IssueComments('%s', '%s', '%s', '%s', '%s', '%s')>" % (self.id, 
                                                                        self.body, 
                                                                        self.issue, 
                                                                        self.user, 
                                                                        self.created, 
                                                                        self.change_time)
class UsersCommentsModel(基本):
__tablename_uuu='users\u comments'
user\u id=Column(整数,ForeignKey('users.id'),primary\u key=True)
comment\u id=列(整数,ForeignKey('issue\u comments.id'),primary\u key=True)
投票=列(整数(1))
用户=关系(UsersModel,
backref=“用户意见”)
注释=关系(IssueCommentsModel,
backref=“用户意见”)
定义初始化(自我,**字段):
自我记录更新(字段)
定义报告(自我):
返回“%”(self.user\u id,
self.comment\u id,
自我评价(投票)
发布评论。py

class UsersModel(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(50))
    email = Column(String(50))
    issues = relationship(IssuesModel, backref="user")
    comments = relationship(IssueCommentsModel, backref="user")
    voted_comments = association_proxy('users_comments', 'comment')

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<Users('%s', '%s', '%s')>" % (self.id,
                                              self.username,
                                              self.email)
class UsersCommentsModel(Base):
    __tablename__ = 'users_comments'
    user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
    comment_id = Column(Integer, ForeignKey('issue_comments.id'), primary_key=True)
    vote = Column(Integer(1))

    user = relationship(UsersModel,
                        backref="users_comments")
    comment = relationship(IssueCommentsModel,
                           backref="users_comments")

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<UsersComments('%s', '%s', '%s')>" % (self.user_id,
                                                      self.comment_id,
                                                      self.vote)    
class IssueCommentsModel(Base):
    __tablename__ = 'issue_comments'

    id = Column(Integer, primary_key=True)
    body = Column(String(300))
    created = Column(DateTime)
    change_time = Column(DateTime)
    score = Column(Integer(100), default=0)
    issue_id = Column(Integer, ForeignKey('issues.id'))
    user_id = Column(Integer, ForeignKey('users.id'))
    voted_users = association_proxy('users_comments', 'user')

    def __init__(self, **fields):
        self.__dict__.update(fields)

    def __repr__(self):
        return "<IssueComments('%s', '%s', '%s', '%s', '%s', '%s')>" % (self.id, 
                                                                        self.body, 
                                                                        self.issue, 
                                                                        self.user, 
                                                                        self.created, 
                                                                        self.change_time)
class IssueCommentsModel(基本):
__tablename_uuu='issue_comments'
id=列(整数,主键=True)
主体=列(字符串(300))
已创建=列(日期时间)
更改时间=列(日期时间)
分数=列(整数(100),默认值为0)
issue\u id=列(整数,ForeignKey('issues.id'))
user\u id=列(整数,ForeignKey('users.id'))
投票用户=关联代理('users\u comments','user'))
定义初始化(自我,**字段):
自我记录更新(字段)
定义报告(自我):
返回“%”(self.id,
自我身体,
自我问题,
自我使用者,
自创的,
自我改变(时间)
每个用户都可以创建评论,也可以向上/向下投票。以上代码完全是工作代码。我的问题是。当我删除UsersCommentsModel类中的两个backref时,代码不再工作,并抛出InvalidRequestError。它表示在UsersModel映射器上找不到users_comments属性。我认为这很奇怪,b/c我认为您可以通过中心用户\注释关系模型代理所有关系,而不必在用户/注释模型中实际存储该模型的实例

问题:
有没有办法删除backref,这样就不会在用户/注释模型中存储其他属性?

如果删除用户\u注释backref,什么是“中心用户\u注释关系模型”?我没有看到任何其他关系使用“users\u comments”的名称。删除这两个反向引用意味着名称“users\u comments”不再是一个映射属性,关联代理不再能够定位它被告知要使用的内容。好吧,我想这是一个我没有注意到的微妙之处,关联代理实际上使用了您在其中定义它的模型的一个成员。我认为,通过指定association\u proxy('users\u comments',{attr}),sqla将关联代理到附加到“users\u comments”表的模型。因此,我想我要问的主要问题是,是否有一种方法可以通过“二级”表(即model2s=relationship(Model2,secondary=SecondaryTable,backref=“model1”))定义一个多对多关系,并将其更改为通过关联对象定义的多对多关系?这样就可以处理我所有的多对多关系,我可以选择在关系的中间添加一个额外的字段给关联表。我认为在过去几个月里重写的文档应该使这些问题变得清晰。就m2m到关联而言,任何m2m都可以通过删除“secondary”参数并替换为显式映射来转换为关联,如第二个链接中的示例所示,为我彻底清除了所有内容。谢谢