djangoでForeignKeyを持つテーブルにオブジェクトを指定してfilterを掛けてみる

2022年5月3日

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'}

2022年5月3日