似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

巳年じゃないけど Python やろうぜ(その 10)

だいぶシリーズが長期化してきました(苦笑)

Model で遊ぶ

今回使用するデータは「現場で使えるSQL 第2版」のものを使用することにします。

現場で使えるSQL 第2版 (DB Magazine SELECTION)

現場で使えるSQL 第2版 (DB Magazine SELECTION)

$ ./manage.py shell
Python 3.6.0 (default, Feb  4 2017, 00:11:30) 
[GCC 6.3.1 20161221 (Red Hat 6.3.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from customer_search.models import Customer
>>> Customer.objects.all()
<QuerySet []>
>>> c = Customer(name='(株)ワイキキソフト', phone='090-AAAA-AAAA')
>>> c.save()
>>> c.id
1
>>> c.name
'(株)ワイキキソフト'
>>> c.phone
'090-AAAA-AAAA'
>>> Customer.objects.all()
<QuerySet [<Customer: Customer object>]>

save はテーブルにデータを保存するメソッドです。実際に DB Browser for SQLite で確認した画面がこちら。

確かにデータは保存されています…が、チュートリアルでは objects.all() の出力を見て「これは困りました*1ね」というお話になります。これはオブジェクトを表示するときに文字列化する models.Model.__str__ メソッドをオーバーライドしていないので、デフォルトのものが使用されている*2ことによります。

このままだと、後程説明する管理画面での表示にも差し障るので、models.py を改造しましょう。

from django.db import models

# Create your models here.


class Customer(models.Model):
    name = models.CharField(max_length=20)
    phone = models.CharField(max_length=20)

    def __str__(self):
        return self.name

自身の name の内容を表示するように変更しました。もう一度 shell を起動して確認してみましょう。

$ ./manage.py shell
Python 3.6.0 (default, Feb  4 2017, 00:11:30) 
[GCC 6.3.1 20161221 (Red Hat 6.3.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from customer_search.models import Customer
>>> Customer.objects.all()
<QuerySet [<Customer: (株)ワイキキソフト>]>
>>> Customer.objects.filter(id=1)
<QuerySet [<Customer: (株)ワイキキソフト>]>
>>> Customer.objects.get(pk=1)
<Customer: (株)ワイキキソフト>

filter は条件に合致するデータを全て取得するもので、出力の型は QuerySet になっています。一方の get は主キーを指定してそれに該当する単一のデータを取得するものなので、出力の型は Customer になります。

表示に顧客名が表示されていて、いい感じですね。次回は管理画面を利用して Model を管理する方法について書きます。

*1:オブジェクトの内容が表示されていないということです。

*2:デフォルトの挙動は公式ドキュメントからソースコードを参照するとわかります。