Djangoのモデルの作成や取得、更新、削除について解説する

スポンサーリンク

Django のモデルは、Database のテーブルやコレクションを表現するクラスです。

これはテーブルに関する全ての情報を含みます。

これらのモデルは、Django アプリの models.py ファイルに一緒に保存されます。

ユーザ DB、ブック DB、または Web アプリケーションが必要とする他のテーブルのような、異なる情報を含む異なる DB のための多くの異なるモデルが存在することができます

スポンサーリンク

Django モデルの基本構造

class Modelname(models.Model):
    '''A class representing a model derived from Model class'''
    #Fields
    Field_name = models.CharField(max_length = , hepl_text = , choices = , Null etc)
 
    #Metadata
    class Meta:
        Ordering = [‘field_name’]
 
    #Methods
    def __str__(self):
        return '<readable_name>'

1. モデル内のフィールド

特定のモデルは任意の数のフィールドを持つことができ、これらはデータベーステーブルの様々な属性を表します。

フィールドには多くの異なるタイプがあります

  • CharField
  • 整数値
  • 電子メール

これらのフィールドは、以下のような引数を取ることもできます。

max_length – 入力可能な最大文字数。

2. 2. プライマリキー – このフィールドが全てのエントリで一意であることを Django に伝えます。

3. 3. 外部キー – これは、あるモデルと別のモデルを接続するために使われます。

4. 4. NULL – true の場合、空のフィールドは NULL 値に変換され、char フィールドは空文字列と して扱われます。

5. 5. 選択肢 – フィールドが与えられた選択肢のうちの1つだけでなければならない場合(オプションボックスのようなもの)
6. 6. 空白 – trueの場合、フィールドは空白にすることができ、それ以外は埋めなければなりません。

2. モデルメタデータ

このメタデータには様々な機能があり、その中でも重要なのが順序付けです。

これは、データベース上でその要求を出したときに、特定の順番で回答を表示することができます

構文は以下の通りです。

ordering ['<Name>']

例えば、がCharFieldの場合はアルファベット順、IntergerFieldの場合は数値の昇順などです。

もし、構文に”-“記号が使われている場合は、逆順になることを意味します。

ordering [-'<name>']

3. Django モデルにおけるメソッド

これらは、より良いクライアントインタフェース、つまり、より良いプレゼンテーションのために使用されます。

例えば、 _str ³³ は、データベース内の各特定要素について、管理サイトで何を表示するか (短い名前のようなもの) を指示します。

ここで、以下の情報を持つBooksのプロジェクトを作成してみましょう。

  • すべての本についての情報を持つホームページ
  • 全ての本に関する情報を含むホームページ。(これは Django の URL マッピングで見ました)

そのために、これまでの記事で得た知識を使って、books という名前のアプリを作 りましょう。

1. 最初の Django モデルを作成する

books/models.py で、タイトル、価格、ジャンルを属性として持ち、メタデータの順序をタイトルにしたモデル DB を作ってみましょう。

python manage.py migrate
python manage.py makemigrations <app_name>
Python manage.py sqlmigrate <app_name> 0001

次に、このテーブルをデータベース内に作成する必要があります。

デフォルトでは、 Django は SQLite データベースエンジンを使用します。

今のところ、この DB 自体を使うことにします。

使用している DB は settings.py の DATABASES で確認できます。

Python manage.py migrate

2. データベースにテーブルを作成する

テーブルを作成するために、まずマイグレーションを適用する必要があります。

以下のコードをシェルで書いてください。

python manage.py shell

そしてもう一度、実行します。

from <app_name>.models import <model_name>

出力は、データベースの作成が成功したことを示します。

モデルテーブルが SQLite で準備できました。

モデルに変更を加えるたびに、DBのテーブルにも変更を加えるために、上記のステップを繰り返す必要があることに注意してください。

では、DBにデータを取り込み、追加する方法を学びます。

DBから情報を取得する

まず、ディレクトリの中でPythonシェルを開き、次のコマンドを実行します。

<model_name>.objects.all()

これにより、シェルの中にPythonコンソールが表示されるようになります。

モデルテーブルから情報を追加/取得するために、モデルテーブルをインポートする必要があります。

テーブルをインポートするためのシンタックスは以下の通りです。

BookModel.objects.all()

私の場合、次のようになります。

A = <model_name>()

1. 1. レーブルからすべてのオブジェクトを取得する

このために、次の構文を使います。

A.Title = "Harry Potter"
A.Price = 120
A.Genre = "Fantasy Fiction"
A.save()

したがって、私のコードは次のようになる。

<Model_name>.objects.filter(Title =”<Title_Element>”)

2. テーブルへの情報の追加

情報を追加するための構文は、オブジェクト指向のPythonの構文に似ています。

ここでは、まずモデル名でクラスオブジェクトを作成し、必要な属性を追加します。

オブジェクトを作るには、次のような構文になります。

<model_name>.objects.get(Title = <"title_element">)

例えば、以下の様になります。

a = BookModel.objects.get(title = "Ghostbuster")

こうして、最初の本の情報が入力されました。

同じように、もう少し追加してみます。

a.title()
a.price()
a.genre()

3. DB からレコードをフィルタリングする

Django のモデル Database からレコードをフィルタリングするために、以下を実行します。

from books.models import BookModel
a =BookModel.objects.get(title="<book_name">)
a.delete()

したがって、例えば、ジャンルが Fiction である本を全てフィルタリングする場合

def BookView(request):
    books = BookModel.objects.all()
 
    html = ''
    for book in books:
        var = f'<li> {book.title} </li><br>'
        html = html + var
    return HttpResponse(html,status = 200)

4. 4. ある要素に関する完全な情報の取得

注意: filter を使用する場合、要素は短い形式で取得されます (def s_str __) しかし、要素に関する完全な情報が必要な場合は、次のメソッドを使用します。

BookModel
BookModel

ここでは、タイトル、価格、ジャンルなどすべての情報を取得できます。

このとき

settings.py
Settings.py

このとき、すべての情報はオブジェクトとして格納されるので、以下のように実装すれば、対応する値を表示することができます

Python Shell
Python Shell

5. DBから行要素を削除する

特定の要素を削除するには、.delete() という構文を使用します。

Addition To DB
Addition To DB

views.py を使ってモデル DB に接続する

次に、DBから情報を取得し、それをWebページに表示する方法を学びます。

Views.pyに以下のコードを追加します。

Filter
Filter

このコードから、基本的にDBの情報を変数booksに取得し、DBから各要素を取得し、HTMLとしてWebページに表示するループを開始したことが理解できると思います。

また、このViewのエンドポイント(Books/)を提供する必要があります。

Django-URL マッピングの記事から得た知識を元に、自分で試してみてください。

URL mapping
URL mapping

さて、Web ページ (books/

) です。

以下のコードを見て、理解を深めてください。

BookIDView
BookIDView

このコードは単純で、Getを使ってbooks_nameに関する全ての情報を取得し、HTMLとしてウェブページに表示しているだけです。

ここでは、DBから特定の情報を取得し、それをWebページに表示しています。

このViewに対して、urls.pyがどのように見えるか見てみましょう。

URL mapping - BookIDView
URL mapping – BookIDView

では、サーバを起動して動作するか確認します。

Runserver
Runserver

書籍/ウェブページ用のブラウザページ

Browserbooks 1024x583 1
Browser (books/)

books/

Webページのブラウザページ

Browser Ghostbuster
Browser (books/Ghostbuster)
BrowserHarry Potter 1024x583 1
Browser (books/Harry Potter)

外部キーによる他のモデルへの接続

外部キー(FK)は、共通の情報を使用している2つのデータベースをリンクさせるために使用されます。

これにより、データベースをきれいに保つことができ、また、同じ情報を何度も入力する必要がなくなります。

次に、Booksアプリで著者モデルテーブルを作成し、Bookモデル内にAuthor Filter_idフィールドを追加してみましょう。

ここで、複数の書籍が同じAuthorを持つ可能性があるため、Author_tery_idはBookModelの外部キーとして動作することに注意してください。

FKを使用すると、特定の著者によって書かれた様々な本を検索することができます

また、もし著者がアカウントを削除した場合、彼のすべての本も自動的に削除され、BookModel から手動で削除する作業を減らすことができます。

最初のうちは少し戸惑うかもしれませんが、何度も練習していくうちに、だんだん分かってくるはずです。

AuthorModel
AuthorModel

これで、BookModel に Author フィールドを追加することができます

Authorfield django models
Author_id Field


新しい AuthorModel のために migrations を実行する必要があります。

また、BookModelのDBを変更したので、前述のシェルコード(migrations)を実行する必要があることに注意してください。

Migrations
Migrations

データベースには、Author フィールドを除いたいくつかの情報が既にあります。

そのため、Django はそれらのために author_id フィールドにデフォルト値を入力するように要求します。

.delete() を使って移行を適用する (テーブルを変更する) 前に、以前の要素をすべて削除することが望ましいです。

これで、本の情報を追加したのと同じように、著者 DB に情報を追加できるようになりました。

Author DB
Author DB

また、練習として、BookViewと同じようにAuthor Viewを自分で作ってみてください。

ここまでで、シェルからテーブルにデータを入力することを学びましたが、これは最も効率的なデータの追加方法ではありません。

一番簡単な方法は、管理画面からデータを追加することです。

その方法については、次回以降に説明します。

また、管理サイトからは、このFK全体の働きや、FKを通じてAuthor DBとModel DBがどのようにリンクされているかなど、より詳しい情報を得ることができます。

まとめ

以上で、本記事は終了です。

次回は、管理サイトのインターフェイスについて学び、FKの有用性をより良く理解する予定です。

</name

タイトルとURLをコピーしました