DEV Community

kaede
kaede

Posted on • Updated on

Django Tutorial Part 3 -- Choice テーブルをシェルでCRUD する

前提

https://docs.djangoproject.com/en/4.0/intro/tutorial02/#playing-with-the-api

Django Tutorial の Part2 シェルで遊ぼう編をやる

環境は作ってあって、Question とそれに基づく Choice モデルがある状態


Question テーブルと関連する Choice テーブルのカラムを取得する

テーブルの中身の取り方を調べる

https://docs.djangoproject.com/en/4.0/topics/db/queries/

https://qiita.com/okoppe8/items/66a8747cf179a538355b#%EF%BC%91%E5%AF%BE%EF%BC%91%EF%BD%8E%E5%AF%BE%EF%BC%91%E3%81%AE%E9%96%A2%E4%BF%82

TableName.objects.get(columnName=value)
Enter fullscreen mode Exit fullscreen mode

普通にテーブルのカラムを取得するときはこれで取れて

リレーショナルになっていて、子供テーブルがある場合は

.childTableName_set.all()
Enter fullscreen mode Exit fullscreen mode

これで取れる。

親が1つで子供が複数の場合は

TableName.objects.select_related('childTableName').get(id=1)
Enter fullscreen mode Exit fullscreen mode

こうやって取得するらしい。


実際に子供テーブルを取得

docker-compose run web \
python manage.py shell

Enter fullscreen mode Exit fullscreen mode

shell モードを起動


>>> from polls.models import Choice, Question

>>> Question.objects.get(pk=1)
<Question: What's up?>
Enter fullscreen mode Exit fullscreen mode

ModelName.objects.get で参照すると、前回 str で仕込んだので中身が見える。primary key が 1 の Question モデルのレコードを確認できた。

>>>
q = Question.objects.get(pk=1)
q.choice_set.all()
<QuerySet []>
Enter fullscreen mode Exit fullscreen mode

これを q という変数に入れる
q の中の子供テーブルの中身を表示する


子供テーブルのレコードを作成

>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>]>
Enter fullscreen mode Exit fullscreen mode

childTableName_set.create(column_name=value)
これで中身を新たに作成できる


子供テーブルの中身を数える

>>> q.choice_set.count()
1
Enter fullscreen mode Exit fullscreen mode

子供テーブルは
parent.childrenTable_set.count でデータの数を数えられる


子供テーブルの中身を検索して削除する

>>> c = q.choice_set.filter(choice_text__startswith='Not')
>>> c
<QuerySet [<Choice: Not much>]>

>>> c.delete()
(1, {'polls.Choice': 1})

>>> q.choice_set.all()
<QuerySet []>
>>> 
Enter fullscreen mode Exit fullscreen mode

.filter() で検索して、.delete() をすることで削除ができる

これで Tutorial に従って、子供テーブルの削除までの操作ができた。


まとめ

TableName.objects.get(columnName=value)
Enter fullscreen mode Exit fullscreen mode

objects.get でテーブルの中のレコードを取得することができて

.childTableName_set.all()
Enter fullscreen mode Exit fullscreen mode

_set.all でそのテーブルの中の子供テーブルたちを取得できる

childTableName_set.create(column_name=value)
Enter fullscreen mode Exit fullscreen mode

_set.create で子供テーブルの中身は作成できて

.filter で検索できて、.delete で削除できる。


次にやること

update を調べる

https://docs.djangoproject.com/en/4.0/intro/tutorial02/#introducing-the-django-admin

admin を作り、phpMyAdmin みたいなものを動作させる。

Top comments (0)