烧瓶通过ID进行多对多循环,无法将数据插入表中

时间:2018-10-23 10:58:48

标签: python sqlalchemy

我正在尝试将数据追加到表

>>> 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。我不知道我在做错什么吗?

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))