djangoでmodel定義やas_viewクラスメソッド、tests.pyを触ってみる。
今回はdjangoでmodels.pyやtests.pyを触ってみましたのでまとめます。
djangoのバージョン:1.11.8
models.pyへの記述をmysqlへ反映させる
python manage.py makemigrations (App名) python manage.py migrate
ちなみにテーブル名は(App名)_(models.pyで定義したclass名)となる。
idはデフォルトで作られる(auto_incrementもデフォルト)
特異?だなと思ったのは、URLのフィールドをURLFieldという形でCharFieldとは分けてmodelに定義できる。 また、外部キーもForeignKeyという形で特別に定義できる。
この辺がURLとして、外部キーとしてデフォルト機能で特別に定義できるのは個人的には嬉しいです。この辺をcakephpとかで やろうとすると、いろいろ面倒なのではと思います。テーブルを確認すると、urlのフィールドの型は普通にvarcharとなってました。
modelでの関数の定義
def _get_full_name(self):
"Returns the person's full name."
return '%s %s' % (self.first_name, self.last_name)
full_name = property(_get_full_name)
上記のメソッドはプロパティです。これはマネージャーアトリビュートともよばれます。
抽象モデルによる同一フィールドの定義
from django.db import models class CommonInfo(models.Model): name = models.CharField(max_length=100) age = models.PositiveIntegerField() class Meta: abstract = True class Student(CommonInfo): home_group = models.CharField(max_length=5)
上記のように書くと、Studentモデルは home_group, name, age のフィールドを持つことになります。 コードの保守上、このように書くのがいいかと思います。
しかし、上記の書き方だとDBには親テーブルは反映されません。(DBにCommonInfoは作られない)親クラスも反映させたい場合、下記のようにマルチテーブル継承を使います。
class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) class Restaurant(Place): serves_hot_dogs = models.BooleanField() serves_pizza = models.BooleanField()
as_viewクラスメソッド
as_viewメソッドを使うと、インスタンスを作ったり、そのインスタンスプロパティへの代入処理を書くメソッドを簡略化できます。具体的には下記のdispatchメソッドの返り値を簡単に取得できます。
上記のように書くことで、djangoがリクエストがgetかpostかdeleteなのかなどリクエストの種類を内部的に判定してくれます。(クラスベースビューは最初の起点が dispatch メソッドとなり、リクエストメソッド を判定してくれます。)もしgetなら、自動的にMyview.getを実行してくれます。(dispatch が実装されてるメソッドに応じて処理を自動的に分岐してくれる。)
tests.pyを編集してユニットテストを書く
デフォルトの状態のtests.py
from django.test import TestCase
# Create your tests here.
tests.pyにtestで始まる関数を追加していくことでユニットテストが可能となる。
その他の条件
python manage.py testでテストを実行すると、テスト用のDBが自動的に作られる。テスト実行後、テスト用の DBは削除されます。
参考サイト
Djangoフレームワークにおけるmigrations機能の学習ノート(1) - Qiita