djangoでForeignKeyを持つテーブルにオブジェクトを指定してfilterを掛けてみる
djangoでForeignKeyを持つテーブルにオブジェクトを指定してfilterを掛けてみる
ORMについてはチートシートを作っていなかったので少しずつ増やしていきたいと思います。
モデル
モデルは下の通り。
from django.db import models
class Writer(models.Model):
name = models.CharField(max_length=128)
class Article(models.Model):
writer = models.ForeignKey(Writer, on_delete=models.CASCADE , related_name='articles')
title = models.CharField(max_length=512)
contents = models.TextField()
データベース
データは下の通り。
MariaDB [djangodatabase]> select * from myapp_writer;
+----+-----------+
| id | name |
+----+-----------+
| 1 | satoh |
| 2 | suzuki |
| 3 | takahashi |
+----+-----------+
MariaDB [djangodatabase]> select * from myapp_article;
+----+--------+------------------------+-----------+
| id | title | contents | writer_id |
+----+--------+------------------------+-----------+
| 1 | java | java for beginner | 1 |
| 2 | python | python for beginner | 1 |
| 3 | R | R for datascientist | 2 |
| 4 | ruby | practice ruby on rails | 3 |
+----+--------+------------------------+-----------+
プログラム
構文は下の通りです。条件を「「オブジェクト」.writer_id」と書かなくて良いみたいです。
[クラス名].objects.filter('[foreignKeyのフィールド]=[オブジェクト]')
下の通り無事「satoh」が書いた本「java」と「python」だけ取得できました。
python3.6 manage.py shell
# モデルをインポートする。
>>> from myapp.models import Writer, Article
# 筆者のオブジェクトを取得する。
>>> selected_writer = Writer.objects.get(id=1)
# 筆者のオブジェクト(satoh)を確認する。
>>> vars(selected_writer)
{'_state': , 'id': 1, 'name': 'satoh'}
# 筆者のオブジェクトから ForeignKey のフィールドを指定して本のオブジェクトを取得する。
>>> selected_articles = Article.objects.filter(writer=selected_writer)
# 本のオブジェクトを確認する。
>>> print(selected_articles)
<QuerySet [>> vars(selected_articles[0])
{'_state': , 'id': 1, 'writer_id': 1, 'title': 'java', 'contents': 'java for beginner'}
>>> vars(selected_articles[1])
{'_state': , 'id': 2, 'writer_id': 1, 'title': 'python', 'contents': 'python for beginner'}
ディスカッション
コメント一覧
まだ、コメントがありません