Djangoモデル(ORM)


授業内容を整理する


コース名:フィードバック機能付きPython/張高Webサービス開発完全ガイド
講座:ドラムORM

データベースとSQL


SQL:データベースを問い合わせる言語
SQLは直接作成できますが、オブジェクト-リレーションシップマッピング(ORM)を使用してSQLを作成/実行することもできます.
ORMを使用しても、最適化するには、作成したORMコードでどのSQLが実行されているかを決定する必要があります.
  • django-debug-toolbar積極利用
  • 高ORMモデルはRDBのみ対応


    複数種類のPython ORM


    Rleational Databases
  • djangoデータベース、sqlalchemy、transor、peewee、ponyoRMなど
  • NoSQL Databases
  • django-mongodb-engine、hot-redis、MongoEngine、PynamodDBなど
  • 長い間の利点はモデルとFormにありました


    もちろん、将来的には複数のORMライブラリを使用することもできます.適宜混合使用可能
    SQLを直接実行できますが、簡単に言えばORM tkdyd
  • SQL文字列を直接組み合わせるのではなく、それをパラメータと見なす→SQL Injection防止
  • SQL Injectionは、悪意のあるユーザが特定のSQLクエリ文を送信することによってサーバデータベースを攻撃するハッカー技術である
  • Django Model


    データベーステーブルとPythonクラスを1:1にマッピング
    モデルクラス名は、Post(x)、Post(O)などの単数形式です.
  • クラスは大文字で始まるPascalCaseに名前を付けなければなりません
  • マッピングされたモデルクラスは、データベース・テーブル・フィールドの履歴と一致する必要があります.
    モデルを作成する前に、データベース設計はサービスと一致する必要があります.
  • つまり、リレーショナル・データベース(データベースの領域が異なる)
  • を学習する必要がある
    アプリケーションフォルダのmodels.pyファイルに次のように作成します.

    モデルの使用順序

  • 倉庫モデルの作成、データベースジオメトリの管理
  • モデルクラスの作成
  • モデルクラスから移行ファイルを作成→makemigrationsコマンド
  • 移行ファイルをデータベースに適用→migrateコマンド
  • 使用型番
  • 既存の外部データベースを現在のデータベースにインポートしてジオメトリを管理
  • データベースからモデルクラスソースを作成→dbコマンドの確認
  • 使用型番
  • モデル名とデータベース・テーブル名


    DBテーブル名:デバッガ「アプリケーション名モデル名」
    ex.
    ブログアプリケーション
  • Post型番:blog post
  • Comment型番:blog comment
  • shotアプリケーション
  • Item型番:shot item
  • review型番:shop review
  • 適用順序


    Itemモデルの定義
    移行ファイルの作成
    python3 manage.py makemigrations 앱이름
    移行ファイルの適用
    python3 manage.py migrate
    データベースチェック
    #sqllite가 생성되어 있다면
    python3 manage.py dbshell

    上記の順序でモデルを作成および適用


    アプリケーションの登録


    Instagramというアプリケーションの作成
    python3 manage.py startapp instagram
    settings.アプリケーション名をpyに追加
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'blog',
        'instagram',
    ]

    urls.直接pyを追加
    入力内容は次のとおりです.
    urlpatterns = []
    プロジェクトディレクトリurls.pyに次の行を追加

    モデルの作成


    Instagramディレクトリモデル.pyでモデルを作成するには、次の手順に従います.
    from django.db import models
    
    # Create your models here.
    class Post(models.Model):
        message = models.Textfield()
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

    移行ファイルの適用

    python3 manage.py makemigrations instagram
    誤字がある場合は、次のエラーが発生します.
    AttributeError: module 'django.db.models' has no attribute 'Textfield'
    または設定します.pyにアプリケーションを追加していないか、アプリケーションを追加して保存していない場合は、次のエラーが発生します.
    No installed app with label 'instagram'.
    成功後、灸は以下の通りである.
    Migrations for 'instagram':
      instagram/migrations/0001_initial.py
        - Create model Post

    移行ファイルの適用


    次のコマンドを入力します.
    python3 manage.py migrate instagram
    下図のように、モデルとして表示されます.pyで作成したPostというテーブルに基づいて
    Operations to perform:
      Apply all migrations: instagram
    Running migrations:
      Applying instagram.0001_initial... OK

    データベース内のコードの確認

    python3 manage.py sqlmigrate instagram 0001_initial
    以下のコマンドが入力されていることがわかります(idは指定されていませんが、primary keyが自動的に生成され、Xに勝つ)
    BEGIN;
    --
    -- Create model Post
    --
    CREATE TABLE "instagram_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "message" text NOT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
    COMMIT;