質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • Python

    10253questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    8403questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Flask

    281questions

    FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

  • SQLAlchemy

    49questions

    SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

SQLAlchemy : relationship から参照できない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 470
退会済みユーザー

退会済みユーザー

現在Flask と SQLAlchemy を使ってwebapp 作りに取り組んでいます
relationship から上手く参照できず、結果がNoneになってしまって困っています

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    photos = db.relationship('Photo', back_populates='user')

class Photo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship('User', back_populates='photos')


テーブルはこのような感じです
例えばPhoto のusername を参照し、webに表示したいのですが

@app.route('/')
@app.route('/index')
def index():
    photos = Photo.query.with_entities(Photo.id, Photo.name, Photo.image, Photo.user).all()
    return render_template('index.html', title='Home',photos=photos)
{% for photo in photos %}
{{ photo.user.username }}
{% endfor %}


追記

REPLでの参照は出来たのですが、やはりweb上でデータを操作すると参照ができないです
もしかしたら何か根本的に勘違いしているかもしれません
REPLでの参照方法は(念のため書いておくと)

>>>u = User(username=...)
>>>p = Photo(photo_name=..., user=u)
>>>print(p.id, p.user.username, p.photo_name)
...
...
1 username photo_name


というような感じです

何か原因に心当たりのある方いれば回答お待ちしています

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

with_entries で relationship(=user)を引数で渡して見ました。

session.query(Photo).with_entities(Photo.user).all()

この結果生成されるSQLは下記のようになりました。

SELECT users.id = photos.user_id AS user FROM users, photos

with_entries を使うと、取得される user には bool値がセットされるようです。

for p in session.query(Photo).with_entities(Photo.user).all():
    print(p.user) # => True

回避策としては with_entries を外してクエリを投げるのが一番無難かと思います。

for p in session.query(Photo).all():
    print(p.user.username) # => "user name"

参考

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/27 11:40

    うーん、with_entities()を外したのですがやはりだめですね
    {{ photo.user }} で参照するとNoneで
    {{ photo.user.username }} で参照するとweb上には何も表示されてない状態です
    状況は変わらないです。。。

    キャンセル

  • 2018/03/27 11:42

    {{ photo.user_id }} は ちゃんとユーザーIDが表示されますか?

    キャンセル

  • 2018/03/27 11:46

    None になってしまいます

    キャンセル

  • 2018/03/27 12:12 編集

    None ということは user_id カラムに 対象のユーザーIDが適切に保存できていないことが原因な気がします。多分データベース上で確認しても同じかと。Photoモデルを作成する処理を見直した方が良いかと思います。

    キャンセル

  • 2018/03/27 12:24

    テーブルのコード自体は問題なさそうでしょうか

    キャンセル

  • 2018/03/27 12:28

    migrationフォルダの versionsフォルダ内のコードを直接見ているのですが
    relationshipのコードが反映されてなさそうなのが気になります、

    キャンセル

  • 2018/03/27 13:18

    多分 Flask-migrateか何かを使ってると思うのですが、もう一度簡単なアプリを作って、試してみるのが早いと思います。 https://flask-migrate.readthedocs.io/en/latest/

    キャンセル

  • 2018/03/27 14:01

    REPLでの参照は出来たのですが,やはりweb上でのデータ操作が上手くいっていないみたいです
    追記しました、もし僕が何か勘違いしてそうなことがあればご指摘ください

    キャンセル

  • 2018/03/27 14:11

    REPLでの参照というか、あれはREPL上で オブジェクトを作ってるだけなので「DBに保存できてない」可能性はありますね。Flask-SQLAlchemyなどであれば、db.session.add や db.session.commitを実行することで初めてデータベース上に保存されます。

    http://flask-sqlalchemy.pocoo.org/2.3/quickstart/#a-minimal-application

    キャンセル

同じタグがついた質問を見る

  • Python

    10253questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    8403questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Flask

    281questions

    FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

  • SQLAlchemy

    49questions

    SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。