我正在使用Flask和SQLAlchemy在Search请求和解析数据之间创建一对一的关系。一旦用户检查了搜索结果,他们就可以单击继续解析数据(并创建一个Data类实例)。但是,我不确定如何在__init__
引用之前引用类变量。我希望我的Data
实例拥有请求响应对象r
。
调用代码(views.py):
search = Search(form) # create source result
search.author = g.user
db.session.add(search)
db.session.commit()
...
data = Data()
data.search_id = this_search.id
db.session.add(data)
db.session.commit()
搜索类(models.py):
class Search(db.Model):
id = db.Column(db.Integer, primary_key=True)
timestamp = db.Column(db.DateTime)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
data_id = db.relationship('Data', backref='source', lazy='dynamic')
...
数据类(models.py):
class Data(db.Model):
id = db.Column(db.Integer, primary_key=True)
search_id = db.Column(db.Integer, db.ForeignKey('search.id'))
search = db.relationship('Search', backref="information")
r = None
def __init__(self):
self.r = requests.get(self.search.url)
我得到的错误是:
AttributeError:'NoneType'对象没有属性'url'
很明显,在声明self.r
变量之前,我无法创建Data.search
,因为错误表明它是NoneType
类型。我不确定创建这样的新变量的正确格式应该是什么。如果我将self.r
声明移动到初始化后调用的类方法,则代码有效。谢谢!
答案 0 :(得分:0)
一些建议
search
属性实际上是 ,但它没有设置。如果没有声明,你会得到一个AttributeError
。
调用超类__init__
。这只是所有课程的好习惯
def __init__(*args, **kwargs):
super(Data, self).__init__(*args, **kwargs)
你可以懒惰地计算值
class Data(...):
...
def __init__(...):
...
self._r = None
@property
def r(self):
if self._r is None and self.search is not None:
self._r = requests.get(self.search.url)
return self._r