Flask SQLAlchemy外键关系

17

我在理解SQLAlchemy中的外键和关系方面遇到了很多麻烦。我的数据库中有两个表,第一个是Request,第二个是Agent。每个Request包含一个Agent,每个Agent都有一个Request

class Request(db.Model):
    __tablename__ = 'request'
    reference = db.Column(db.String(10), primary_key=True)
    applicationdate = db.Column(db.DateTime)
    agent = db.ForeignKey('request.agent'),

class Agent(db.Model):
    __tablename__ = 'agent'
    id =     db.relationship('Agent', backref='request', \
    lazy='select')
    name = db.Column(db.String(80))
    company = db.Column(db.String(80))
    address = db.Column(db.String(180))

运行db.create_all()时,我收到以下错误:

无法为表'applicant'上的外键'request.agent'初始化目标列:表'request'中没有名为'agent'的列

1个回答

35

请查看SqlAlchemy关于一对一关系的文档。首先,您需要为每个模型提供一个主键。然后,您需要定义一个外键,它引用另一个模型的主键。现在,您可以使用一个反向引用定义一个关系,从而允许直接访问相关模型。

class Request(db.Model):
    __tablename__ = 'request'
    id = db.Column(db.Integer, primary_key=True)
    applicationdate = db.Column(db.DateTime)

class Agent(db.Model):
    __tablename__ = 'agent'
    id = db.Column(db.Integer, primary_key=True)   
    request_id = db.Column(db.Integer, db.ForeignKey('request.id'))
    request = db.relationship("Request", backref=backref("request", uselist=False))

    name = db.Column(db.String(80))
    company = db.Column(db.String(80))
    address = db.Column(db.String(180))
现在您可以像这样访问您的模型:

现在您可以这样访问您的模型:

request = Request.query.first()
print(request.agent.name)

agent = Agent.query.first()
print(agent.request.applicationdate)

4
在这种情况下,以下两行应该像这样:request_id = db.Column(db.Integer, db.ForeignKey('request.id'))request = db.relationship("Request", backref=db.backref("request", uselist=False))因为数据库被导入为 db - ibedelovski
1
但是 @MrLeeh,你能告诉我为什么 backref = "request" 而不是 "Request" 吗? - yts61
1
表名为“request”。这是您需要在此处传递的内容。 - MrLeeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接