巳年じゃないけど Python やろうぜ(その 10)
だいぶシリーズが長期化してきました(苦笑)
Model で遊ぶ
今回使用するデータは「現場で使えるSQL 第2版」のものを使用することにします。
現場で使えるSQL 第2版 (DB Magazine SELECTION)
- 作者: 小野哲,藤本亮
- 出版社/メーカー: 翔泳社
- 発売日: 2006/11/16
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 22回
- この商品を含むブログ (12件) を見る
$ ./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 を管理する方法について書きます。