WeRn-rm
@WeRn-rm
Диванный разработчик

Flask-SQLAlchemy связь один ко многим, как решить проблему внешнего ключа?

Подскажите пожалуйста, как решить проблему:

Вылазят 2 исключения при настройке связи один ко многим
Can't find any foreign key relationships between '1c_items' and '1c_stock_info'.

Could not determine join condition between parent/child tables on relationship Items.stocks - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.


Код модели Items
class Items(db.Model):
    __tablename__ = '1c_items'

    id = db.Column(db.VARCHAR(100), primary_key=True, unique=True, nullable=False)
    manufacturer_id = db.Column(db.VARCHAR(100), nullable=False)  # Производитель
    price_group_id = db.Column(db.VARCHAR(100), nullable=True)  # Ценовая группа, может быть = NULL. Если NULL - цена по запросу
    code = db.Column(db.VARCHAR(50), nullable=True)  # КОд
    article = db.Column(db.VARCHAR(255), nullable=False)  # Артикул изделия
    name = db.Column(db.VARCHAR(500), nullable=False)  # Название изделия
    name_print = db.Column(db.VARCHAR(500), nullable=True)  # Название для печати
    type = db.Column(db.VARCHAR(255), nullable=True)  # ВидНоменклатуры
    storage_unit = db.Column(db.VARCHAR(50), nullable=True)  # Еденица хранения
    description = db.Column(db.Text, nullable=True)  # Описание
    volume = db.Column(db.Float, nullable=False)  # Объем
    volume_unit = db.Column(db.VARCHAR(50), nullable=True)  # ОбъемЕдиницаИзмерения
    weight = db.Column(db.Float, nullable=False)  # Вес
    weight_unit = db.Column(db.VARCHAR(50), nullable=True)  # ВесЕдиницаИзмерения
    length = db.Column(db.Float, nullable=False)  # Длина
    length_unit = db.Column(db.VARCHAR(50), nullable=True)  # ДлинаЕдиницаИзмерения
    image_url = db.Column(db.VARCHAR(255), nullable=True)  # Путь до изображению

    property_collection = db.Column(db.VARCHAR(255), nullable=True)  # Коллекция
    property_color = db.Column(db.VARCHAR(255), nullable=True)  # Цвет
    property_function = db.Column(db.VARCHAR(255), nullable=True)  # Функция
    property_protection = db.Column(db.VARCHAR(255), nullable=True)  # Степень защиты
    property_insert_color = db.Column(db.VARCHAR(255), nullable=True)  # Цвет вставки
    property_product = db.Column(db.VARCHAR(255), nullable=True)  # Изделие
    property_amperage = db.Column(db.VARCHAR(255), nullable=True)  # Номинальный ток
    property_status = db.Column(db.VARCHAR(255), nullable=True)  # Статус
    property_device_type = db.Column(db.VARCHAR(255), nullable=True)  # Тип устройства
    property_poles_count = db.Column(db.VARCHAR(255), nullable=True)  # Количество полюсов
    property_switching_off = db.Column(db.VARCHAR(255), nullable=True)  # Кривая отключения
    property_breaking = db.Column(db.VARCHAR(255), nullable=True)  # СвойствоОтключающаяСпособностьKA
    property_leakage_current = db.Column(db.VARCHAR(255), nullable=True)  # Ток утечки
    property_type = db.Column(db.VARCHAR(255), nullable=True)  # Тип
    property_direct_current = db.Column(db.VARCHAR(255), nullable=True)  # Постоянный ток

    stocks = db.relationship('StockInfo', backref='item', lazy="joined")

Код модели StocksInfo
class StockInfo(db.Model):
    __tablename__ = '1c_stock_info'

    id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=True, unique=True)
    item_id = db.Column(db.VARCHAR(100), db.ForeignKey('1c_items.id'), nullable=False)  # Номенклатура ID
    party_id = db.Column(db.VARCHAR(100), nullable=False)  # Партия ID


Связь в DB существует:
5ffb7e221a9ef464510860.png

Но по итогу я получаю выше описанную ошибку при запуске приложения.

Вот запрос который используется:
item = db.session.query(Items).first()
  • Вопрос задан
  • 520 просмотров
Решения вопроса 1
WeRn-rm
@WeRn-rm Автор вопроса
Диванный разработчик
Проблему исправил сам... Ошибка была в конфигурации
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы