'NoneType'对象没有属性,在__init__之前声明了引用类变量

时间:2016-07-13 17:38:19

标签: python sqlalchemy python-requests

我正在使用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声明移动到初始化后调用的类方法,则代码有效。谢谢!

1 个答案:

答案 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