Многие ко многим, используя параметр foreign_keys - PullRequest
0 голосов
/ 04 апреля 2019

Мне нужно создать отношения многие ко многим между двумя таблицами.Мне нужно указать параметр foreign_keys, так как в обеих таблицах есть другие ссылки друг на друга.

Пробовал несколько подходов, используя Class объявление таблицы ассоциаций и Table объект напрямую.

Когда я удаляю опцию foreign_keys в обоих классах User and Feature`, она работает, но когда я добавляю другие поля с сопоставлениями между этими двумя классами, я получаю исключение множественных путей.

feature_user = Table(
    'feature_user',
    Base.metadata,
    Column('feature_id', Integer, ForeignKey('features.id')),
    Column('user_id', Integer, ForeignKey('users.id')),
)

class Feature(Base):
    __tablename__ = 'features'

    id = getIdColumn()

    # other fields...

    cpm_engineers = relationship(
        'User',
        secondary=feature_user,
        foreign_keys=[feature_user.columns.user_id],
        back_populates='cpm_engineer_of',
    )

class User(Base):
    __tablename__ = 'users'

    id = getIdColumn()

    # other fields...

    cpm_engineer_of = relationship(
        'Feature',
        secondary=feature_user,
        foreign_keys=[feature_user.columns.feature_id],
        back_populates='cpm_engineers',
    )

При создании User из Feature я получаю следующую ошибку: sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Feature.cpm_engineers - there are no foreign keys linking these tables via secondary table 'feature_user'. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify 'primaryjoin' and 'secondaryjoin' expressions.

1 Ответ

0 голосов
/ 05 апреля 2019

Я полагаю, что проблема заключалась в том, что я пытался использовать одну и ту же таблицу для хранения связей «многие ко многим» для нескольких привязок, например, пользователь-тестировщик функций, пользователь-разработчик функций и т. Д. Это, конечно, неправильно,Мне нужно было добавить собственный JOIN, используя третий столбец (например, добавить новый столбец role) или создать отдельную таблицу для каждой ассоциации (что я и сделал в конце).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...