2016-07-13 9 views
0

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宣言を初期化の後に呼び出されるクラスメソッドに移動すると機能します。ありがとう!

+0

私は '__init__'にあなたの初期化機能を置く値を計算することができ... – Alex

+0

だから、あなたが仕事にこれを期待していませんでしたか?新しい 'Data'インスタンスを作成します。まだ' search'値が設定されておらず、あなたはその値にアクセスしようとします。 'search'を' __init__'に渡すか、 'r'を後で設定する必要があります。 – davidism

+0

また、 'self.r'を設定すると、' r'はクラス変数ではなくインスタンス変数になります。 – davidism

答えて

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 
+0

助けてくれてありがとう!私はPythonが@propertiesを構築する方法を読んできましたが、まだ少し混乱しています。したがって、プロパティをgetterとsetterに分割したい場合は、 'self.r(self.search.url) '​​で' r'を設定したように見えますが、 'NoneType object is not callable'というエラーが出ます。私がそれを打ち砕かなくても、私はどのように 'r'を設定するのですか? – tomtom92

+0

今は分かりません!あなたの提案に基づいて 'r'を設定するために何かを明示的に呼び出す必要はありません。これで 'data.r'で' r'にアクセスできます。ありがとう! – tomtom92

+0

はい、そうです。 'r'を設定する機能を公開したい場合は、' @ r.setter'を使って別のメソッドをデコレートし、そのメソッドが単一の引数を受け入れるようにすると、その値を 'self._r'やその他のものに設定することができますそれと一緒にやりたい –

関連する問題