tixture55’s diary

主にプログラミング関係の日記です。

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メソッドの返り値を簡単に取得できます。

from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request, *args):
return HttpResponse('Hello, World!')
def myview(request, *args):
view_obj = MyView()
view_obj.request = request
view_obj.args = args
return view_obj.dispatch(request, *args)
myview = MyView.as_view()

上記のように書くことで、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で始まる関数を追加していくことでユニットテストが可能となる。

その他の条件

  • アプリディレクトリの下にtestから始まるファイルを作る
  • django.test.TestCaseを継承したクラスを作る

 

python manage.py testでテストを実行すると、テスト用のDBが自動的に作られる。テスト実行後、テスト用の DBは削除されます。


参考サイト

Djangoフレームワークにおけるmigrations機能の学習ノート(1) - Qiita

qiita.com

qiita.com

Django: Model — 苦労する遊び人の玩具箱 1 ドキュメント

qiita.com