SQLAlchemyでFlaskを使用して、検索要求と解析済みデータの間に1対1の関係を作成しています。ユーザーが検索結果を確認したら、[続行]をクリックしてデータを解析して(データクラスインスタンスを作成する)ことができます。しかし、私は__init__
参照の前にクラス変数を参照する方法が不明です。 Data
インスタンスに要求応答オブジェクトr
が必要です。'NoneType'オブジェクトに属性がありません。__init__の前に宣言された参照クラス変数
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)
コード(views.py)を呼び出す
私が得るエラーは:
AttributeError: 'NoneType' object has no attribute 'url'
NoneType
タイプであることを示すので、Data.search
変数が宣言される前にself.r
を作成することはできません。私はこのような新しい変数を作成する正しい形式がどんなものであるべきかわかりません。コードは、self.r
宣言を初期化の後に呼び出されるクラスメソッドに移動すると機能します。ありがとう!
私は '__init__'にあなたの初期化機能を置く値を計算することができ... – Alex
だから、あなたが仕事にこれを期待していませんでしたか?新しい 'Data'インスタンスを作成します。まだ' search'値が設定されておらず、あなたはその値にアクセスしようとします。 'search'を' __init__'に渡すか、 'r'を後で設定する必要があります。 – davidism
また、 'self.r'を設定すると、' r'はクラス変数ではなくインスタンス変数になります。 – davidism