首页 > 解决方案 > SQLAlchemy 中的多对一关系

问题描述

我的 SQLAlchemy 模型之间的多对一关系有问题。ChangeOrder(many) 和Contract(one)之间的关系很好,但是LineItem(many) 和ChangeOrder(one) 之间的关系不起作用。

我已经尝试了基本关系文档中建议的两种方法,但都失败了LineItemtoChangeOrder关系。

# using back_populates
class Contract(Base):
    __tablename__ = "contract"
    id = Column(Integer, primary_key=True)
    change_orders = relationship("ChangeOrder", back_populates="contract")


class ChangeOrder(Base):
    __tablename__ = "changeorder"
    id = Column(Integer, primary_key=True)
    line_items = relationship("LineItem", back_populates="change_order")
    contract_id = Column(Integer, ForeignKey("contract.id"))
    contract = relationship("Contract", back_populates="change_orders")


class LineItem(Base):
    __tablename__ = "lineitem"
    id = Column(Integer, primary_key=True)
    change_order_id = Column(Integer, ForeignKey("changeorder.id"))
    change_order = relationship("ChangeOrder", back_populates="line_items")


def test_insert_change_order(db_session, item):
    c = Contract()
    db_session.add(c)
    db_session.commit()
    co = ChangeOrder(contract_id=c.id)
    db_session.add(co)
    db_session.commit()
    row = db_session.query(Contract).get(c.id)
    assert len(row.change_orders) == 1  # this Many-to-One works
    li = LineItem(change_order_id=co.id)
    db_session.add(li)
    db_session.commit()
    row = db_session.query(ChangeOrder).get(co.id)
    assert len(row.line_items) == 1  # this Many-to-One does not

我也尝试了这种backref方法,但它有同样的问题。

# using backref
class LineItem(Base):
    __tablename__ = "lineitem"
    id = Column(Integer, primary_key=True)
    change_order_id = Column(Integer, ForeignKey("changeorder.id"))
    change_order = relationship("ChangeOrder", backref="line_items")


class ChangeOrder(Base):
    __tablename__ = "changeorder"
    id = Column(Integer, primary_key=True)
    contract_id = Column(Integer, ForeignKey("contract.id"))
    contract = relationship("Contract", backref="change_orders")


class Contract(Base):
    __tablename__ = "contract"
    id = Column(Integer, primary_key=True)

conftest.py

import pytest
from flask_sqlalchemy import SQLAlchemy

from frontend.app import app


@pytest.fixture
def testapp():
    db = SQLAlchemy()
    app.config["SQLALCHEMY_ECHO"] = True
    with app.app_context():
        db.create_all()
        yield app
        db.session.remove()
        db.drop_all()


@pytest.fixture(scope="session")
def database():
    db = SQLAlchemy()
    with app.app_context():
        db.create_all()
        yield db


@pytest.fixture(scope="session")
def _db(database):
    return database

标签: sqlalchemyforeign-keys

解决方案


推荐阅读