sqlalchemy - SQLAlchemy 中的多对一关系
问题描述
我的 SQLAlchemy 模型之间的多对一关系有问题。ChangeOrder
(many) 和Contract
(one)之间的关系很好,但是LineItem
(many) 和ChangeOrder
(one) 之间的关系不起作用。
我已经尝试了基本关系文档中建议的两种方法,但都失败了LineItem
toChangeOrder
关系。
# 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
解决方案
推荐阅读
- docker - Docker-entrypoint.sh 导致带有 golang 的 ARM 映像“未找到”
- java - 错误:无法访问 jarfile - 运行 bfg.jar 时
- javascript - 使用前未定义的前向参考任务
- java - 关于 com.jcraft.jsch.JSchException: UnknownHostKey: xycom 的查询。DSA 密钥指纹是“ac:ew:....”
- node.js - create-react-app + npm start - 'react-scripts' 未被识别为内部或外部命令
- c++ - 复杂类型的 QVector 与 std::vector
- python - Django-Private-Chat in , TemplateDoesNotExist at /dialogs/
- python - Numpy:如何用一维数组索引二维数组?
- html - 背景颜色在一个位置不稳定
- r - 决策树 rpart 通过插入符给出 ROC 为 0.5