Как объявить один ко многим, если для одного внешнего ключа есть 2 поля - PullRequest
0 голосов
/ 23 августа 2010

Я новичок в python (sqlalchemy), и я учусь создавать веб-сайт с помощью пилонов и sqlalchemy.

У меня проблема, когда я объявляю отношения между моделями. Я пробовал это несколько часов, но не получилось. Но я думаю, что это должен быть основной вопрос.

У меня есть два класса: Пользователь и Статья, пользователь может создавать статьи и изменять статьи других людей (например, вики). Таким образом, пользователь создал статьи и редактировал статьи.

class Article(Base):
    __tablename__ = 'articles'

    id = Column(Integer, primary_key=True)
    title = ...

    user_id = Column(Integer, ForeignKey('users.id'))
    editor_id = Column(Integer, ForeignKey('users.id'))

    # relations
    user = relationship('User', backref='articles') # -> has error


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String(20))

    def __init__(self):
        pass

Но отображается ошибка:

InvalidRequestError: One or more mappers failed to compile. Exception was probably suppressed within a hasattr() call. Message was: Could not determine join condition between parent/child tables on relationship Article.user. Specify a 'primaryjoin' expression. If this is a many-to-many relationship, 'secondaryjoin' is needed as well.

Я пытался добавить primaryjoin в строку («есть ошибка»), но не знаю, как это должно быть. Я попробовал несколько кодов, но ни один не работает.

Заранее спасибо!

1 Ответ

2 голосов
/ 23 августа 2010

Ах, это очевидно.

Класс Article имеет две ссылки на User, user_id и editor_id, поэтому SQLA не знает, какую из них использовать для ваших отношений.Просто используйте явное primaryjoin:

user = relation('User', backref='articles', primaryjoin="Article.user_id==User.id")
...