繁体   English   中英

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

[英]Flask Many to Many loop through id to insert data to table not working

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

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

您将uselist设置为False 不要这样做 ,您告诉SQLAlchemy page属性应该是一个标量 ,一个元素:

page = db.relationship('Paper', secondary=papers, lazy='subquery',
    backref=db.backref('pages', lazy=True), uselist=False)

uselistrelationship文档中

一个布尔值,指示是否应将此属性作为列表或标量加载。 在大多数情况下,此值是在映射器配置时由relationship()根据relationship()的类型和方向自动确定的-一对多形成一个列表,多对一形成一个标量,许多对一个列表。 如果需要标量,通常在该位置会存在一个列表,例如双向一对一关系,请将uselist设置为False

您不希望设置该属性而是将其留给SQ​​LAlchemy来确定它应该是什么。 对于多对多关系,您确实希望它为True ,而当您忽略它时,这就是自动结果:

page = db.relationship('Paper', secondary=papers, lazy='subquery',
    backref=db.backref('pages', lazy=True))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM