ひこぽんのーと

覚書と雑記です。

Djangoをやってみよう。 その6-Model/DBの操作-

その5の続き。

まだ画面も何もないので、
コンソールからモデルの操作をやってみる。
実行自体は簡単でpythonの対話モードを使う。
ただし、Djangoの機能だったり、
helloサイト上のクラスを正しく使うには、
ちょっとした手順がある。

python manage.py shell

このコマンドを実行するとhelloサイトの設定が読み込まれた状態で
Pythonの対話モードが起動する。

対話モードに入ったらまず、艦種を登録してみる。

>>> from warship.models import ShipClass
>>> ship_class = ShipClass()
>>> ship_class.name = u'駆逐艦'
>>> ship_class.save()

ShipClassをインポートしたあと、ShipClassのインスタンスを作り、
nameに「駆逐艦」を設定したあと、saveメソッドを呼ぶだけ。
これで、DBに対してInsertが走る。

登録されたかどうか、検索してみる。
とりあえず、全件検索の<モデル>.objects.all()を実行してみる。

>>> ShipClass.objects.all()
<QuerySet [<ShipClass: ShipClass object>]>

なんか帰ってきたがよくわからんね。
チュートリアルでは「モデルに__str__メソッドを追加するのが重要です。」なんて、
あとに書いてある。
こっちも真似してmodels.pyのクラスを以下のように変えてみる。

from django.db import models

# Create your models here.


class ShipClass(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class Warship(models.Model):
    ship_class = models.ForeignKey(ShipClass, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)

    def __str__(self):
        return u"{0} - {1}".format(self.ship_class, self.name)

そしたら、一旦、対話モードを終了し、再度、対話モードで実行しなおして
検索を行ってみる。

>>> ShipClass.objects.all()
<QuerySet [<ShipClass: 駆逐艦>]>

中身が見えるようになったので、登録されていたことが確認できた。
all()は全件検索なので、絞り込みをやってみよう。

>>> ship_class = ShipClass.objects.filter(name=u"駆逐艦")
>>> print(ship_class)
<QuerySet [<ShipClass: 駆逐艦>]>

絞り込みはfilter()。
抽出条件をキーワード引数で指定すると、絞り込みを行ってくれる。

ついでに、もう一回登録をやってみる。
今度は、艦船を登録してみる。

>>> ship_class = ShipClass.objects.filter(name=u"駆逐艦")[0]
>>> from warship.models import Warship
>>> warship = Warship()
>>> warship.ship_class = ship_class
>>> warship.name = u"暁"
>>> warship.save()
>>> Warship.objects.all()
<QuerySet [<Warship: 駆逐艦 - 暁>]>

とまぁ、うまくできているようだ。
データベースを触らずにテーブル作って、データ登録までできるって
なんて楽なんだろう。

といったところで、次回へ続く。