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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

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

Q&A

1回答

3940閲覧

Django, select_relatedとprefetch_relatedの組み合わせ

foxriver

総合スコア34

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

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

0グッド

0クリップ

投稿2018/11/18 09:10

djangoにおけるクエリの生成についての質問です。

python

1class Group(Model): 2 name = models.CharField("名称",max_length=100) 3 4class User(Model): 5 name = models.CharField("名称",max_length=100) 6 group = models.ForeignKey(Group, related_name="user_group") 7 8class Task(Model): 9 name = models.CharField("名称",max_length=100) 10 group = models.ForeignKey(Group, related_name="task_group") 11 status = models.IntegerField(default=0)

上記のようなモデル構成だとします。
この場合、関係性は User - Group - Task = many - 1 - many
となりますが、ここでユーザー起点で見たときにタスクに辿り着かせる方法を模索しています。

まずUserとGroupを結びつけるために

python

1users = User.objects.select_related("group").all() 2```とし、次にGroupの中にTaskを含むために 3```ここに言語を入力 4#groupに対して付与するprefetch要素 5tasks = Prefetch("task_group", 6 queryset=Task.objects.filter(status=0), 7 to_attr="tasks") 8```とすることで要素としては完成できました。 9しかしこの後にこの二つを組み合わせてuserから参照する方法がわからず困っています。 10 11理想的な形としてはそれぞれのユーザーが 12```python 13for user in users: 14 print (user.tasks) 15 #または 16 print (user.group.tasks)

とすることでタスクにアクセスできるようにしたいのですが...

どなたか良い解決策を知っていましたら、ご教授いただければと思います。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gh640

2018/11/26 03:07

回答させていただきましたが、問題は解決しませんか?
guest

回答1

0

Django 2.1.x と仮定して回答させていただきますね。

ForeignKey を定義するときに related_name をセットされているので、その名前で参照を逆方向に辿ることができます。

つまり、今回の場合ですと、次の形でそのユーザにひもづく Task オブジェクトのリストが取得できるものと思います。

python

1for user in users: 2 print(user.group.task_group)

公式ドキュメントの次のところあたりにその説明が載っていますので、よろしければご覧ください。

投稿2018/11/18 11:45

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問