Укажите путь соединения по умолчанию для нескольких внешних ключей между таблицами.Python

Программы на Python
Ответить
Anonymous
 Укажите путь соединения по умолчанию для нескольких внешних ключей между таблицами.

Сообщение Anonymous »

Код

Код: Выделить всё

class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)

class Asset(Base):
__tablename__ = 'asset'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('user.id'))
user = relationship(User, foreign_keys=[user_id])

created_by = Column(Integer, ForeignKey(f"user.id"))
updated_by = Column(Integer, ForeignKey(f"user.id"))

items = db.execute(select(User).join(Asset)).all()

выдает ошибку:

Код: Выделить всё

sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'user' and 'asset'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.

Очевидный способ решить эту проблему — указать в операторе, какой внешний ключ использовать:

Код: Выделить всё

items = db.execute(select(User).join(Asset.user)).all()
Но есть ли способ решить эту проблему путем изменения модели?
Мне хотелось бы что-то вроде:

Код: Выделить всё

    created_by = Column(Integer, ForeignKey(f"user.id", do_not_use_for_joins=True))
updated_by = Column(Integer, ForeignKey(f"user.id", do_not_use_for_joins=True))
или хотя бы:

Код: Выделить всё

    user = relationship(User, foreign_keys=[user_id], use_as_default_when_no_key_specified=True)
Потому что поля созданные_по и обновленные_по добавлены во многие таблицы и уже написано много кода.
Это может быть быть идеологическим вопросом. Это нормально не помечать созданные_by и обновленные_by как внешние ключи в моделях (но оставлять их такими в базе данных)?

Подробнее здесь: https://stackoverflow.com/questions/793 ... een-tables
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»