我正在尝试将数据追加到表
>>> paper = ['1', '2']
>>> work = Work(name="Sample", cost="500")
>>> db.session.add(work)
>>> for pape1 in paper:
>>> paper1 = Paper.query.filter_by(id=pape1).first()
>>> paper1.pages.append(work)
>>> db.session.add(paper1)
>>> db.session.commit()
models.py
papers = db.Table('papers',
db.Column('work_id', db.Integer, db.ForeignKey('work.id'), primary_key=True),
db.Column('paper_id', db.Integer, db.ForeignKey('paper.id'), primary_key=True)
)
class Work(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(90), nullable=False)
page = db.relationship('Paper', secondary=papers, lazy='subquery',
backref=db.backref('pages', lazy=True), uselist=False)
cost = db.Column(db.Integer)
class Paper(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(90), nullable=False)
我认为我应该得到这样的东西。
work_id | paper_id
---------|-----------
1 1 | 1
---------|-----------
2 1 | 2
但是我明白了。 论文表
图1。
work_id | paper_id
---------|-----------
1 1 | 2
---------------------
id = 2的论文曾经与id = 1的作品联系在一起。 但是当我开始调试时。我看到第一次循环后,它添加到文件表。这样。
图2。
work_id | paper_id
---------|-----------
1 1 | 1
---------------------
但是在第二个循环之后,我认为它会将其从图2更新为图1。我不知道我在做错什么吗?
答案 0 :(得分:2)
您将uselist
设置为False
。 不要这样做,您告诉SQLAlchemy page
属性应该是 scalar ,是单个元素:
page = db.relationship('Paper', secondary=papers, lazy='subquery',
backref=db.backref('pages', lazy=True), uselist=False)
来自relationship
documentation for uselist
:
一个布尔值,指示是否应将此属性作为列表或标量加载。在大多数情况下,此值由
relationship()
在映射器配置时根据关系的类型和方向自动确定-一对多形成一个列表,多对一形成一个标量,许多对一个列表。如果需要标量,并且通常存在一个列表,例如双向一对一关系,请将uselist
设置为False
。
您不想不设置属性,而是将其留给SQLAlchemy来确定它应该是什么。对于多对多关系,您确实希望它是True
,而当您忽略它时,这就是自动结果:
page = db.relationship('Paper', secondary=papers, lazy='subquery',
backref=db.backref('pages', lazy=True))