Нужны ли обратные ссылки при использовании прокси-ассоциаций для многих ко многим? - PullRequest
1 голос
/ 23 октября 2011

Итак, используя 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)

users_comments.py

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)    

issue_comments.py

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)

Каждый пользователь имеет возможность создавать комментарии и голосовать за них вверх или вниз. Приведенный выше код полностью рабочий код. У меня вопрос такой. Когда я удаляю две ссылки в классе UsersCommentsModel, код больше не работает и выдается ошибка InvalidRequestError. В нем говорится, что атрибут users_comments не может быть найден в преобразователе UsersModel. Я подумал, что это странно, потому что я думаю, что вы сможете проксировать все отношения через центральную модель отношений users_comments, и вам никогда не придется хранить экземпляр этой модели в моделях users / comments.

Вопрос:

Есть ли способ удалить backrefs, поэтому в моделях пользователей / комментариев нет других атрибутов?

...