English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Django クイックスタート-データベースモデルの詳細な操作チュートリアル
このシリーズの初級編は終わりました。前回のチュートリアルに続き、この講座ではデータベースを構築し、最初のモデルを作成し、Djangoが自動的に生成する管理サイトを使用します。
今、mysiteを開きます/settings.py。Djangoの設定モジュールは、通常のPythonモジュールと同様に変数をモジュールレベルで設定します。
デフォルトでは、設定はSQLiteを使用しています。データベースの初心者である場合や、Djangoを学習しようとする場合、これは最も簡単な選択です。SQLiteはPythonに含まれているため、データベースをサポートするために何かをインストールする必要はありません。あなたの最初の実際のプロジェクトを開始するとき、より強力なデータベース、例えばPostgreSQL、MySQLなどを使用する可能性があります。データベースの切り替えを設定することができます。
他のデータベースを使用する場合は、対応するデータベースバインディングをインストールし、以下のキーをデータベースの「デフォルト」設定項目で変更して、あなたのデータベース接続設定に合わせてください:
ENGINE – 入力'django.db.backends.sqlite3', 'django.db.backends.postgresql','django.db.backends.mysql',または'django.db.backends.oracle' NAME – データベースの名前。SQLiteを使用する場合、データベースはあなたのコンピュータ上にファイルとして作成されます;この場合、ファイル名を含む完全な絶対パスの名前であるべきです。デフォルト値はos.path.join(BASE_DIR, 'db.sqlite')です。3)は、あなたのプロジェクトディレクトリに保存されます。
SQLiteを使用していない場合、USER、PASSWORD、HOSTなどの設定を追加する必要があります。詳細については、以下を参照してください。 データベースの参照文書。
あなたがmysiteを編集するとき/settings.py、時区設定TIME_ZONE。
また、このファイルの上のINSTALLED_APPS設定に注意してください。ここには、このDjangoサンプルでアクティブ化されているすべてのDjangoアプリケーションの名前が含まれています。アプリケーションは複数のプロジェクトで使用でき、他のプロジェクトにパッケージとして提供し、そのプロジェクトで使用することができます。
デフォルトでは、INSTALLED_APPSには以下のアプリケーションが含まれています。これらはすべてDjangoを使用しています:
django.contrib.admin – 管理サイト、ここではすぐに使用します django.contrib.auth – 認証システム django.contrib.contenttypes – 一つのフレームワーク、コンテンツタイプ django.contrib.sessions – セッションフレームワーク django.contrib.messages – メッセージ伝達フレームワーク django.contrib.staticfiles – 静的ファイルを管理するフレームワーク
これらのアプリケーションには、デフォルトとして便利な一般的な例が含まれています。
中には少なくとも1つのデータベーステーブルを使用するアプリケーションがありますので、これらのアプリケーションを使用するためには、データベースにテーブルを作成する必要があります。これを行うには、以下のコマンドを実行します:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py migrate 実行する操作: すべてのマイグレーションを適用します: admin, contenttypes, auth, sessions マイグレーションを実行しています: モデルステートのレンダリング... 完了 contenttypes.000 を適用しています...1_initial... OK auth.000 を適用しています...1_initial... OK admin.000 を適用しています...1_initial... OK admin.000 を適用しています...2_logentry_remove_auto_add... OK contenttypes.000 を適用しています...2_remove_content_type_name... OK auth.000 を適用しています...2_alter_permission_name_max_length... OK auth.000 を適用しています...3_alter_user_email_max_length... OK auth.000 を適用しています...4_alter_user_username_opts... OK auth.000 を適用しています...5_alter_user_last_login_null... OK auth.000 を適用しています...6_require_contenttypes_0002... OK auth.000 を適用しています...7_alter_validators_add_error_messages... OK sessions.000 を適用しています...1_initial... OK C:\Python27\mysite>
migrate コマンドは INSTALLED_APPS 設定に注目し、my-site に応じてテーブルを作成します。/settings.py ファイルのデータベース設定、およびアプリケーションデータベースのテーブル移行を行います(後のチュートリアルで説明します)。適用可能な移植メッセージが見られます。興味がある場合は、コマンドラインでデータベースクライアントを実行し、例えば type\dt (PostgreSQL)、SHOW TABLES; (MySQL)、.schema (SQLite)、または SELECT TABLE_NAME FROM USER_TABLES; (Oracle)を実行して、Djangoが作成したテーブルを表示します。
今、モデルを定義します - 本質的にはデータベースが設計され、他のメタデータを使用されます。
私たちのシンプルな調査アプリケーションでは、QuestionとChoiceの2つのモデルを作成します。Questionには問題タイトルと公開日があります。Choiceには選択テキストと投票数の2つのフィールドがあります。各選択肢は1つの問題に関連付けられています。
これらの概念はシンプルなPythonクラスで表されます。pollsを編集します/models.pyファイル、したがって polls/models.pyは以下のようになります:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
このコードは直接的です。各モデルはdjango.db.models.Modelクラスのサブクラスです。- 各モデルには多くのクラス変数があり、それぞれがモデルの変数とデータベースのフィールドに関連付けられています。
各フィールドはFieldクラスのインスタンスで表されます。- 例えば、CharFieldは文字列型フィールド、DateTimeFieldは日付時間フィールドを表します。これによりDjangoに各フィールドが保存するデータのデータ型を教えます。
各Fieldインスタンス(例えば、question_textやpub_date)の名前はフィールドの名前で、これは機械に友好的な形式です。Pythonコードでこの値を使用すると、データベースはそれを列名として使用します。
フィールドにはさまざまなオプションパラメータがあります;このサンプルでは、投票数のデフォルト値を0に設定しています。
最後に注意すべき点は関係の定義です。ここでは外部キーを使用しています。これによりDjangoに各オプションがどの質問に関連しているかを伝えます。Djangoは一般的なデータベース関係をすべてサポートしています:多対一、多対多および一対一。
モデルコードは小さいが、Djangoの多くの情報を表しています。これによりDjangoは以下を行えます:
このアプリケーション用のデータベースを作成します(CREATE TABLE文)
QuestionとChoiceオブジェクトへのPythonデータベースアクセスAPIを作成します
しかし、まずpolls項目がインストールされているアプリケーションを教える必要があります。
mysiteを再び編集します/settings.py ファイルを編集し、INSTALLED_APPS設定に文字列“polls.apps.PollsConfig”を含めるようにします。以下のようになります:
mysite/settings.pyファイルの内容は以下の通りです:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]今やDjangoはpolls投票プログラムを知っています。次のコマンドを実行してみましょう:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py makemigrations polls 0001 - model Choiceを作成 - model Questionを作成 - field questionをchoiceに追加 C:\Python27\mysite>
makemigrationsを実行することで、Djangoにモデルの一部の変更を行ったことを伝え、変更を移植として保存したいと伝えます(この場合、最新のものです)
マイグレーションは、Djangoがモデルの変更(データベースのアーキテクチャによって決定)をどのように保存するかです- それらはディスク上のファイルにあります。新しいモデルの移植を読み込むのが好きな場合は、ファイル polls//0001
また、migrationsを実行して、データベーススキーマ(テーブル)を自動管理するコマンドがあります - これがマイグレーションと呼ばれるもので、SQLを実行して移植の動作を確認しましょう。sqlmigrateコマンドは、移植名を返してSQLに表示します:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 $ python manage.py sqlmigrate polls 0001
以下のようなものが見えるはずです(読みやすく再フォーマットしました):
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py sqlmigrate polls 0001 BEGIN; -- -- model Choiceを作成 -- CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL); -- -- model Questionを作成 -- CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL); -- -- field questionをchoiceに追加 -- ALTER TABLE "polls_choice" RENAME TO "polls_choice__old"; CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" int er NOT NULL REFERENCES "polls_question" ("id")); INSERT INTO "polls_choice" ("choice_text", "votes", "id", "question_id") SELECT "choice_text", "votes", "id", NULL FROM "polls_choice__old"; DROP TABLE "polls_choice__old"; CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id"); COMMIT; C:\Python27\mysite>
マイグレーションコマンドは、まだ適用されていないすべてのマイグレーション(Djangoはデータベースの特別なテーブル名django_migrationsを使用してそれらを追跡)を実行し、データベースでそれらを実行します。 - 基本的には、モデルを使用してデータベーススキーマの変更を同期します。
今、私たちはインタラクティブなPythonシェルとDjangoが提供するAPIに入りましょう。Pythonコマンドラインを呼び出すには、以下のコマンドを使用してください:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 C:\Python27C:\Python\mysite>python manage.py shell Python 2.7.10 (デフォルト, 5月 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] オン wi n32 詳細情報については「help」、「copyright」、「credits」または「license」を入力してください。 (対話式コンソール) >>>
「python」を入力するだけで大丈夫です。なぜなら、manage.pyはDJANGO_SETTINGS_MODULE環境変数を設定し、Django Pythonはmysiteにインポートパスを設定するからです。/settings.pyファイル。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 >>> import django >>> django.setup()
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 >>> from polls.models import Question, Choice # 先ほど書いたモデルクラスをインポートします。 # システムにはまだ質問がありません。 >>> Question.objects.all() [] # 新しい質問を作成します。 # 時差対応のサポートはデフォルトの設定ファイルで有効になっていますので、 # Djangoはpub_dateに対してtzinfoを持つdatetimeを期待します。timezone.now()を使用してください。 # datetime.datetime.now()の代わりに使用すると、正しい処理が行われます。 >>> from django.utils import timezone >>> q = Question(question_text="何が新しいか?", pub_date=timezone.now()) # オブジェクトをデータベースに保存します。save()を明示的に呼び出す必要があります。 >>> q.save() # 現在にはIDがあります。このIDが""と表示されるかもしれません。1L" 代替 "1", 依存関係 # 使用しているデータベースによって異なります。これは大したことではありません;ただ、あなたの # データベースバックエンドは Python 長整数として整数を返すことを好みます。 # objects. >>> q.id 1 # モデルのフィールド値は Python 属性を通じてアクセスします。 >>> q.question_text "What's new?" >>> q.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # 値を変更するには、属性を変更してから save() を呼び出します。 >>> q.question_text = "What's up?" >>> q.save() # objects.all() はデータベース内のすべての質問を表示します。 >>> Question.objects.all() [<Question: Question オブジェクト>]
ここでは少し待っていただく必要があります。 <Question: Question オブジェクト> はこのオブジェクトの無意味な表現です。この問題を解決しましょう:polls ディレクトリ内の Question モデルを編集します。/models.py ファイル) に __str__() メソッドをこれらの Question と Choice モデルに追加してください:
polls/models.py ファイルの内容は以下の通りです:# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 from django.db import models from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible # Pythonをサポートする必要がある場合にのみ 2 class Question(models.Model): # ... def __str__(self): return self.question_text @python_2_unicode_compatible # Pythonをサポートする必要がある場合にのみ 2 class Choice(models.Model): # ... def __str__(self): return self.choice_text
追加 __str__() メソッドは非常に重要です。モデルに追加する際のインタラクティブなヒント処理は、自分自身だけでなく、オブジェクトの表現が Django の自動生成管理全体に使用されるためです。
これらは通常のPythonメソッドです。カスタムメソッドを追加するために、ここを示しています:polls/models.py
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 import datetime from django.db import models from django.utils import timezone class Question(models.Model): # ... def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
ここにdatetimeとfrom django.utils import timezoneを追加してください。Pythonの標準のdatetimeモジュールとDjangoの時区関連のユーティリティがdjango.utils.timezoneに含まれています。Pythonの時区処理に不慣れであれば、以下を参照してください。 時区サポートドキュメント。
これらの変更を保存し、python manage.py shellを再び実行して新しいPythonインタラクティブシェルを起動します:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 >>> from polls.models import Question, Choice # 確保__str__()の追加が機能している。 >>> Question.objects.all() [<Question: なんですか?>] # Djangoは、完全に引数で動作する豊富なデータベースルックアップAPIを提供しています。 # キーワード引数。 >>> Question.objects.filter(id=1) [<Question: なんですか?>] >>> Question.objects.filter(question_text__startswith='What') [<Question: なんですか?>] # 获取今年发布的题目。 >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Question.objects.get(pub_date__year=current_year) <質問: 何かありますか?> # 存在しないIDをリクエストすると、例外が発生します。 >>> Question.objects.get(id=2) Traceback(最も最近の呼び出しから): ... DoesNotExist: 検索に一致する質問が存在しません。 # 主キーによる検索は最も一般的なケースであり、Djangoは # 基本のショートカット-key 異なる検索 # 以下はQuestion.objects.get(id=1). >>> Question.objects.get(pk=1) <質問: 何かありますか?> # カスタムメソッドが機能していることを確認します。 >>> q = Question.objects.get(pk=1) >>> q.was_published_recently() True # 質問にいくつかの選択肢を与えます。create呼び出しは新しい # ChoiceオブジェクトがINSERT文を実行し、選択肢をセットに追加します # 利用可能な選択肢の数を返し、新しいChoiceオブジェクトを生成します。Djangoは # 外部キー関係の「他方」を保持するセット # (例:質問の選択肢)APIを通じてアクセスできる >>> q = Question.objects.get(pk=1) # 関連オブジェクトセットから選択を表示する -- まだありません。 >>> q.choice_set.all() [] # 3つの選択肢を作成します。 >>> q.choice_set.create(choice_text='あまりない', votes=0) <選択肢: あまりない> >>> q.choice_set.create(choice_text='空', votes=0) <選択肢: 空> >>> c = q.choice_set.create(choice_text='またハッキング中', votes=0) # Choiceオブジェクトは関連する質問オブジェクトにAPIアクセスがあります。 >>> c.question <質問: 何かありますか?> # 逆も然り:QuestionオブジェクトはChoiceオブジェクトにアクセスできます。 >>> q.choice_set.all() [<選択肢: あまりない>, <選択肢: 空>, <選択肢: またハッキング中>] >>> q.choice_set.count() 3 # APIは必要な範囲まで関係を自動的にフォローします。 # 関係を区別するためにダブルアンダースコアを使用します。 # どれだけ深いレベルでも動作します;制限はありません。 # 今年のpub_dateがあるどんな質問のChoiceをすべて取得します # (上記で作成した'reuse current_year'変数を使用します). >>> Choice.objects.filter(question__pub_date__year=current_year) [<選択肢: あまりない>, <選択肢: 空>, <選択肢: またハッキング中>] # 選択肢の1つを削除します。そのためにはdelete()を使用します。 >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()
まず、管理インターフェースにログインできるユーザーを作成する必要があります。以下のコマンドを実行します:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08c:\python27\mysite> python manage.py createsuperuser
あなたが望むユーザー名(なんでもいいので)を入力し、Enterキーを押してください。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 ユーザー名: admin
その後、メールアドレスを入力するように求められます(なんでもいいので):
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 メールアドレス: [email protected]
最後に、パスワードを入力する必要があります。それはパスワードを2回入力する必要があり、2番目は最初の確認です。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 パスワード: ********** パスワード(再入力): ********* スーパーユーザーが正常に作成されました。
Django管理サイトはデフォルトでアクティブです。開発サーバーを起動し、それを探求しましょう。
サーバーが動作していない場合は、以下のように起動してください:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 c:\python27\mysite>python manage.py runserver
今、Webブラウザを開き、「/admin/”ローカルドメイン- 例えば、 http://127.0.0.1:8000/admin/ 管理者ログインインターフェースが表示されるはずです:
デフォルトで有効化されているため、ログイン画面があなたの言語で表示されることがあります。翻訳がデフォルトで有効化されているため、ログイン画面があなたの言語で表示されることがあります。
前の手順で作成したスーパーユーザーアカウントでログインを試みてください。Django管理のホームページが表示されるはずです:
編集可能な内容が見えるはずです:グループとユーザー。これらはdjango.contrib.auth、Djangoの認証フレームワークによって提供されています。
pollアプリケーションは管理インデックスページに表示されません。
やるべきことはただ一つです:管理者にQuestionオブジェクトが管理インターフェースを持つことを伝える必要があります。これを行うために、pollアプリケーションがどこにあるかを確認してください。/admin.pyファイルを開き、以下のように修正してください:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ja.oldtoolbag.com # Date : 2020-08-08 from django.contrib import admin from models import Question admin.site.register(Question)
現在、Questionを登録しました。Djangoは、管理ホームページに表示されるべきであることを知っています:
「Questions」をクリックします。現在、「change list」ページで問題を確認できます。このページはデータベース内のすべての問題を表示し、変更する問題を選択できます。先に作成した問題も含まれます:
「What's new?」という質問をクリックして編集します:
注意すべき点は以下に示します:
フォームは問題(Question)モデルから自動的に生成されます。
異なるモデルのフィールドタイプ(DateTimeField、CharField)は対応するHTML入力部品に対応しています。各フィールドタイプは、Django管理でどのように表示されるかを知っています。
DateTimeField フィールドは JavaScript ショートカットを受け取ります。日付は「Today」のショートカットを受け取り、カレンダーが弹出し、複数回「Now」のショートカットを受け取り、現在の常用時間が表示されるウィンドウが弹出します。「Date published」を「Today」および「Now」のショートカットをクリックして変更します。次に「Save and continue editing」をクリックし、右上角の「History」をクリックします。変更履歴が表示されるページで、Django管理でこのオブジェクトに適用されたすべての変更が一覧表示されます。変更者のユーザー名とタイムスタンプが表示されます: コードのダウンロード: http://pan.baidu.com/s/1jGR3wDg