我想要两张桌子。一个想法和另一个标签。这种关系应该是多对多的。
我创建了一个桥接表:
tag_idea = db.Table('tag_idea',
db.Column('idea_id', db.Integer, db.ForeignKey('idea.id')),
db.Column('ideatag_id', db.Integer, db.ForeignKey('idea_tag.id'))
)
这是我的两个模型:
class Idea(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
idea_name = db.Column(db.String(40), nullable=False)
idea = db.Column(db.String(5000), nullable=False)
idea_owner = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
idea_category = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)
tags = db.relationship('IdeaTag', secondary=tag_idea, backref='ideas',
primaryjoin=tag_idea.c.idea_id==id,
secondaryjoin=tag_idea.c.ideatag_id==id)
class IdeaTag(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
tag = db.Column(db.String(25), nullable=False)
tag_owner = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
所以为了测试这个,我将一个测试想法加载到
test
中,并将一个测试标签加载到 testtag
中
添加到桥接表中,我认为我应该能够使用:
idea.tags.append(testtag)
但是我收到以下错误:
SAWarning: SELECT statement has a cartesian product between FROM element(s) "tag_idea", "idea" and FROM element "idea_tag". Apply join condition(s) between each element to resolve.
从表面上看,我实际上并没有输入 SELECT 语句,因此我不知道如何在 SELECT 语句中应用联接。我该如何解决这个问题?
我通过将 backref 参数设置为此来修复此问题:
backref=db.backref('ideas', lazy='dynamic'), lazy='dynamic,