2016-08-29 15 views
1

here on SO.と同じ問題があると思います。python 3.5、flask-sqlalchemy、およびsqliteを使用しています。私は1つ(ユーザー)から多くの(ポスト)の関係を確立しようとしています。Flask-SQLAlchemy - Backrefが機能しない、値がNone

class User(db_blog.Model): 
    id = db_blog.Column(db_blog.Integer, primary_key=True) 
    nickname = db_blog.Column(db_blog.String(64), index=True, unique=True) 
    email = db_blog.Column(db_blog.String(120), unique=True) 
    posts = db_blog.relationship('Post', backref='author', lazy='dynamic') 

    def __repr__(self): 
     return '<User: {0}>'.format(self.nickname) 

class Post(db_blog.Model): 
    id = db_blog.Column(db_blog.Integer, primary_key=True) 
    body = db_blog.Column(db_blog.String(2500)) 
    title = db_blog.Column(db_blog.String(140)) 
    user_id = db_blog.Column(db_blog.Integer, db_blog.ForeignKey('user.id')) 

    def __init__(self, body, title, **kwargs): 
     self.body = body 
     self.title = title 

    def __repr__(self): 
     return '<Title: {0}\nPost: {1}\nAuthor: {2}>'.format(self.title, self.body, self.author) 

著者はありません。

>>> u = User(nickname="John Doe", email="[email protected]") 
>>> u 
<User: John Doe> 
>>> db_blog.session.add(u) 
>>> db_blog.session.commit() 
>>> u = User.query.get(1) 
>>> u 
<User: John Doe> 
>>> p = Post(body="Body of post", title="Title of Post", author=u) 
>>> p 
<Title: Title of Post 
Post: Body of post 
Author: None> #Here I expect- "Author: John Doe>" 

投稿のセッションの追加/コミット後に同じ結果が得られ、投稿者が見つかりません。

答えて

1

ユーザーのposts属性に新しく作成されたpostを追加した場合、それは動作します:

>>> u = User(nickname="John Doe", email="[email protected]") 
>>> u 
<User: John Doe> 
>>> db_blog.session.add(u) 
>>> p = Post(body="Body of post", title="Title of Post") 
>>> p 
<Title: Title of Post 
Post: Body of post 
Author: None> 
>>> db_blog.session.add(p) 
>>> db_blog.session.commit() 
>>> u.posts.append(p) 
>>> p 
<Title: Title of Post 
Post: Body of post 
Author: <User: John Doe>> 
>>> p.author 
<User: John Doe> 

あなたのコードはそのままで、あなたは__init__を定義したためである動作しない理由Postクラスのコンストラクタです。これはauthorフィールドをまったく考慮していないため、Pythonはそのauthorパラメータで何をすべきか分かりません。

+0

このソリューションは並べ替え後に機能しますが、元のコードが失敗する理由は答えません。再配置された: 'u = User.query.get(1)'、 'p = Post(" body "、" title ")'、 'u.posts.append(p)'、 'db_blog.session.add(p)そしてコミットし、結果は私が望むものです。しかし、私はGrinbergや他の人たちに私のコードを基づいていました。彼らはその投稿をユーザに追加する必要はありません。彼らのコードは私の例のように、ユーザーの質問を投稿に挿入することで動作します。 Ex。 'author = u'です。私のコードが受け入れられる前に私のコードが失敗する理由を誰かが答えることができますか? [マイクロブログチュートリアル](http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database) – Cha0

+0

@ Cha0詳細な説明で私の答えを更新しました –

+0

ありがとうございました。 – Cha0

0

__init__Postに追加しました。それはキーワード引数を受け入れますが、それは何もしません。あなたはどちらか、それは理想的に、あなただけのメソッドを削除することができ、それらを

def __init__(self, body, title, **kwargs): 
    self.body = body 
    self.title = title 
    for k, v in kwargs: 
     setattr(self, k, v) 

かを、使用することを更新し、SQLAlchemyのはあなたのためにそれを処理させることができます。

関連する問題