English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Django快速入门-Detaillierte Anleitung zur Datenbankmodell
Der erste Teil dieser Tutorialreihe ist abgeschlossen. Aufbauend auf dem letzten Tutorial werden wir in diesem Kapitel eine Datenbank erstellen, den ersten Modell erstellen und eine von Django schnell automatisch generierte Verwaltungssite verwenden.
现在,打开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.sqlite3)将存储在您的项目目录中的文件。
如果你不使用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 – Ein Sitzungsframework django.contrib.messages – Eine Nachrichtenübermittlungsframework django.contrib.staticfiles – Ein Framework zur Verwaltung statischer Dateien
Diese Anwendungen umfassen Standardoptionen, als Beispielsfall eine gängige Option.
Einige dieser Anwendungen verwenden mindestens eine Datenbanktabelle, daher müssen die in der Datenbank erstellten Tabellen erstellt werden, um sie verwenden zu können. Dies kann durch Ausführen des folgenden Befehls erreicht werden:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 C:\Python27\mysite>python manage.py migrate Auszuführende Operationen: Alle Migrations anwenden: admin, contenttypes, auth, sessions Migrations ausführen: Modelleigenschaften rendern... ERLEDIGT Anwendung contenttypes.0001_initial... OK Anwendung auth.0001_initial... OK Anwendung admin.0001_initial... OK Anwendung admin.0002_logentry_remove_auto_add... OK Anwendung contenttypes.0002_remove_content_type_name... OK Anwendung auth.0002_alter_permission_name_max_length... OK Anwendung auth.0003_alter_user_email_max_length... OK Anwendung auth.0004_alter_user_username_opts... OK Anwendung auth.0005_alter_user_last_login_null... OK Anwendung auth.0006_require_contenttypes_0002... OK Anwendung auth.0007_alter_validators_add_error_messages... OK Anwendung sessions.0001_initial... OK C:\Python27\mysite>
Der Befehl migrate richtet sich auf die Einstellung INSTALLED_APPS und erstellt basierend auf Ihrem mysite/Die Datei settings.py enthält die Datenbankkonfiguration und bewegt alle Datenbanktabellen, die von der Anwendung verwendet werden (wir werden dies in zukünftigen Tutorials diskutieren). Sie werden jede für die Anpassung passende Nachricht sehen. Wenn Sie interessiert sind, führen Sie den Befehl in Ihrem Datenbankclient aus, z.B. type \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite) oder SELECT TABLE_NAME FROM USER_TABLES; (Oracle), um die von Django erstellten Tabellen anzuzeigen.
Nun werden wir die Modelle definieren - Der Datenbankentwurf erfolgt prinzipiell mit anderen Metadaten.
In unserer einfachen Umfrage-App erstellen wir zwei Modelle: Question und Choice. Question hat einen FrageTitel und ein Veröffentlichungsdatum. Choice hat zwei Felder: Auswahltext und Stimmenzahl. Jede Auswahl ist mit einer Frage verknüpft.
Diese Konzepte werden durch einfache Python-Klassen dargestellt. Bearbeiten Sie polls/models.py-Datei, daher polls/models.py sieht so aus:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 import datetime from django.utils import timezone 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)
Der Code ist direkt. Jedes Modell ist eine Unterklasse der Klasse django.db.models.Model. Jedes Modell hat viele Klassenvariablen, jede davon ist mit einem Feld der Datenbanktabelle verknüpft.
Jedes Feld wird durch eine Instanz der Klasse Field dargestellt – z.B. CharField für zeichenbasierte Felder, DateTimeField für Daten- und Zeitfelder. Dies sagt Django, welchen Datentyp jedes Feld speichert.
Der Name jeder Field-Instanz (z.B. question_text oder pub_date) ist der Name des Felds, das ein maschinenfreundliches Format ist. Diese Wert wird im Python-Code verwendet und die Datenbank verwendet ihn als Spaltenname.
Felder können auch verschiedene optionale Parameter haben; in diesem Beispiel haben wir den Standardwert für die Stimmenzahl auf 0 gesetzt.
Zu beachten ist letztlich die Definition der Beziehungen, hier wird ein Fremdschlüssel verwendet. Dies sagt Django, dass jede Option mit einer Frage verknüpft ist. Django unterstützt alle gängigen Datenbankbeziehungen: ein-zu-eins, viele-zu-eins und viele-zu-viele.
Der Modellcode ist klein, aber er repräsentiert viele Informationen von Django. Mit ihm kann Django:
Erstellen Sie eine Datenbank für diese Anwendung (CREATE TABLE-Anweisung)
Erstellen Sie eine Python-Datenbank-API, um auf die Frage- und Wahlobjekte zuzugreifen
Aber zunächst müssen wir den polls-Punkt mitteilen, welche Anwendungen installiert sind.
Bearbeiten Sie erneut mysite/Datei settings.py, ändern Sie die Einstellungen von INSTALLED_APPS, um den String 'polls.apps.PollsConfig' zu enthalten. Das Ergebnis ist wie folgt:
mysite/Inhalt der Datei settings.py:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 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', ]Jetzt weiß Django, dass es sich um das polls-Abstimmungsprogramm handelt. Lassen Sie uns einen anderen Befehl ausführen:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 C:\Python27\mysite>python manage.py makemigrations polls Migrations für 'polls': 0001_initial.py: - Erstellen Sie das Modell Choice - Erstellen Sie das Modell Question - Fügen Sie das Feld question zu choice hinzu C:\Python27\mysite>
Durch das Ausführen von makemigrations teilen Sie Django mit, dass Sie Änderungen an Modellen vorgenommen haben (in diesem Fall sind sie bereits auf dem neuesten Stand) und dass Sie die Änderungen als Migration speichern möchten.
Migrationen zeigen, wie Django Ihre Modelländerungen speichert (durch die Datenbankarchitektur Ihres Datenbankmodells bestimmt)- Sie sind nur Dateien auf der Festplatte. Wenn Sie möchten, können Sie die neuen Modelle der Migration lesen, die in der Datei polls/Migrations/0001_initial.py. Sie möchten nicht, dass Django jedes Mal, wenn es gestartet wird, diese Dateien liest, aber sie so gestaltet, dass sie von Menschen editiert werden können, müssen Sie wissen, wie Django sich ändert und sie manuell anpassen.
Es gibt auch ein Kommando, um Migrations auszuführen und das Datenbankschema (Tabellen) automatisch zu verwalten: - Das ist das, was als Migration bezeichnet wird, lassen Sie uns die SQL-Kommandos überprüfen, um den移植 zu verstehen. Das sqlmigrate-Kommando gibt den Namen der Migration zurück und zeigt die SQL-Anweisungen an:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 $ python manage.py sqlmigrate polls 0001
Sie sollten etwas Ähnliches wie folgt sehen (wir haben seine Lesbarkeit verbessert):
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 C:\Python27\mysite>python manage.py sqlmigrate polls 0001 BEGIN; -- -- Erstellen Sie das Modell Choice -- CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL); -- -- Erstellen Sie das Modell Question -- CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL); -- -- Fügen Sie das Feld question zu choice hinzu -- 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" integer 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>
Der Migrationsbefehl führt alle noch nicht angewendeten Migrationen aus (Django verfolgt, welche Migrationen in einer speziellen Tabelle namens django_migrations im Datenbank verwendet werden) und führt sie in der Datenbank aus. - Grundsätzlich wird die Verwendung von Modellen zur Synchronisierung der Änderungen im Datenbankschema erfolgen.
Jetzt lassen Sie uns in den interaktiven Python-Shell und die von Django bereitgestellten API eintauchen. Um den Python-Befehlszeilenbefehl aufzurufen, verwenden Sie bitte den folgenden Befehl:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 C:\Python27C:\Python\mysite>python manage.py shell Python 2.7.10 (Standard, Mai 23 2015, 09:44) [MSC v.1500 64 bit (AMD64) auf wi n32 Geben Sie "help", "copyright", "credits" oder "license" ein, um mehr Informationen zu erhalten. (Interaktive Konsole) >>>
Geben Sie einfach "python" ein, da manage.py das Umgebungsvariable DJANGO_SETTINGS_MODULE setzt, das Django Python den Importpfad zu mysite gibt/settings.py-Datei.
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 >>> import django >>> django.setup()
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 >>> from polls.models import Question, Choice # laden Sie die Modellklassen, die wir gerade geschrieben haben. # Es gibt noch keine Fragen im System. >>> Frage.objects.all() [] # Erstellen Sie eine neue Frage. # Die Unterstützung für Zeitzonen ist in der Standardkonfigurationsdatei aktiviert, daher # Django erwartet ein datetime mit tzinfo für pub_date. Verwenden Sie timezone.now() # stattdessen datetime.datetime.now() und es wird das Richtige tun. >>> from django.utils import timezone >>> q = Question(question_text="Was gibt es Neues?", pub_date=timezone.now()) # Speichern Sie das Objekt in der Datenbank. Sie müssen save() explizit aufrufen. >>> q.save() # Jetzt hat es eine ID. Beachten Sie, dass dies "1L" stattdessen "1", abhängig # auf die Datenbank, die Sie verwenden. Das ist kein großes Problem; es bedeutet nur, dass Ihre # Das Datenbank-Backend bevorzugt, Ganzzahlen als Python-Long-Integer zurückzugeben # objects. >>> q.id 1 # Model-Feldwerte über Python-Attribute abrufen. >>> q.question_text "What's new?" >>> q.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # Werte ändern, indem Sie Attribute ändern und save() aufrufen. >>> q.question_text = "What's up?" >>> q.save() # objects.all() zeigt alle Fragen in der Datenbank an. >>> Frage.objects.all() [<Question: Question object>]
Hier müssen wir warten. <Question: Question object> ist eine nutzlose Darstellung dieses Objekts. Lassen Sie uns dieses Problem lösen: durch Bearbeiten des Question-Modells (im polls-Verzeichnis)/models.py Datei (und fügen Sie eine __str__() -Methode zu diesen beiden Question- und Choice-Modellen hinzu):
polls/models.py Dateiinhalt wie folgt:# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 import datetime from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible # nur, wenn Sie Python unterstützen müssen 2 from django.utils import timezone class Frage(models.Model): def __str__(self): return self.question_text @python_2_unicode_compatible # nur, wenn Sie Python unterstützen müssen 2 class Choice(models.Model): class Frage(models.Model): def __str__(self): return self.choice_text
Es ist sehr wichtig, die Methode __str__() hinzuzufügen, da sie interaktive Prompts verwendet, um in das Modell eingefügt zu werden. Dies ist nicht nur für sich selbst praktisch, sondern auch, weil die Darstellung des Objekts für die gesamte Django-Autogenerierung des Managers verwendet wird.
注意,这些都是正常的Python方法。让我们添加一个自定义的方法,这里只是为了演示:polls/Beachte, dass dies normale Python-Methoden sind. Lassen Sie uns eine benutzerdefinierte Methode hinzufügen, hier nur zur Demonstration: polls
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 models.py import datetime from django.db import models from django.utils import timezone class Frage(models.Model): # ... def war_veröffentlicht_kürzlich(self): - return self.pub_date >= timezone.now()1)
Beachte, dass hier import datetime und from django.utils import timezone hinzugefügt werden, um den Standard-Python-Modul datetime und die mit den Zeitzonen verbundenen Utility-Funktionen in django.utils.timezone zu verwenden. Wenn du mit der Zeitzone-Verarbeitung in Python nicht vertraut bist, kannst du Zeitzone-Unterstützungs-Dokumentation.
Speichere diese Änderungen und führe python manage.py shell erneut aus, um einen neuen Python-Interaktionsshell zu starten:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 >>> from polls.models import Frage, Wahl # Stelle sicher, dass unsere __str__() Ergänzung funktioniert. >>> Frage.objects.all() [<Frage: Was los?>] # Django bietet eine reiche Datenbank-Abfrage-API, die vollständig durch # Schlüsselwortargumente. >>> Frage.objects.filter(id=1) [<Frage: Was los?>] >>> Frage.objects.filter(question_text__startswith='What') [<Frage: Was los?>] # Bekomme die Frage, die dieses Jahr veröffentlicht wurde. >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Question.objects.get(pub_date__year=current_year) <Frage: Was los?> # Eine Anfrage nach einer nicht existierenden ID, dies wird eine Ausnahme auslösen. >>> Question.objects.get(id=2) Traceback (letzte Aufrufe zuerst): ... DoesNotExist: Frage, die der Abfrage entspricht, existiert nicht. # Eine Abfrage durch einen primären Schlüssel ist der häufigste Fall, daher bietet Django eine # Kurzwahl für primäre-genaue Schlüsselabfragen. # Dies ist identisch mit Question.objects.get(id=1). >>> Question.objects.get(pk=1) <Frage: Was los?> # Stellen Sie sicher, dass unser benutzerdefinierter Methoden funktioniert. >>> q = Question.objects.get(pk=1) >>> q.was_published_recently() True # Gehen Sie eine Frage einige Auswahlmöglichkeiten zu. Der create-Aufruf erstellt ein neues # Choice-Objekt, führt den INSERT-Befehl aus, fügt die Auswahlmöglichkeit zur Gruppe hinzu # der verfügbaren Auswahlmöglichkeiten und gibt das neue Choice-Objekt zurück. Django erstellt # Eine Gruppe, um die "andere Seite" einer ForeignKey-Beziehung zu speichern # (z.B. eine Auswahlmöglichkeit einer Frage) kann über die API erreicht werden. >>> q = Question.objects.get(pk=1) # Anzeigen Sie alle Auswahlmöglichkeiten aus der zugehörigen Objektgruppe -- Bisher nichts. >>> q.choice_set.all() [] # Erstellen Sie drei Choices. >>> q.choice_set.create(choice_text='nicht viel', votes=0) <Wahl: nicht viel> >>> q.choice_set.create(choice_text='Der Himmel', votes=0) <Wahl: Der Himmel> >>> c = q.choice_set.create(choice_text='Wieder nur Hacking', votes=0) # Choice-Objekte haben API-Zugriff auf ihre verwandten Frage-Objekte. >>> c.question <Frage: Was los?> # und umgekehrt: Frage-Objekte erhalten Zugang zu Choice-Objekten. >>> q.choice_set.all() [<Wahl: nicht viel>, <Wahl: Der Himmel>, <Wahl: Wieder nur Hacking>] >>> q.choice_set.count() 3 # Die API folgt automatisch den Beziehungen, so weit Sie benötigen. # Verwenden Sie doppelte Unterstriche, um Beziehungen zu trennen. # Dies funktioniert so tief, wie Sie möchten; es gibt keine Begrenzung. # Finden Sie alle Choices für jede Frage, deren pub_date in diesem Jahr liegt # (wiederverwendend die 'current_year'-Variable, die wir oben erstellt haben). >>> Choice.objects.filter(question__pub_date__year=current_year) [<Wahl: nicht viel>, <Wahl: Der Himmel>, <Wahl: Wieder nur Hacking>] # Löschen Sie eine der Optionen. Verwenden Sie delete() dafür. >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()
Zunächst müssen wir einen Benutzer erstellen, der sich in die Verwaltung anmelden kann. Führen Sie folgenden Befehl aus:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08c:\python27\mysite> python manage.py createsuperuser
Geben Sie den gewünschten Benutzernamen (beliebig) ein und drücken Sie Enter.
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 Benutzername: admin
Dann wird gefragt, eine E-Mail-Adresse einzugeben (beliebig):
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 E-Mail-Adresse: [email protected]
Das letzte Schritt ist, das Passwort einzugeben. Es wird zweimal nach dem Passwort gefragt, das zweite Mal zur Bestätigung des ersten.
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 Passwort: ********** Passwort (erneut): ********* Superuser erfolgreich erstellt.
Der Django-Verwaltungssitz wird standardmäßig aktiviert. Lassen Sie uns den Entwickler-Server starten und ihn erkunden.
Falls der Server nicht läuft, starten Sie ihn wie folgt:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 2020-08-08 c:\python27\mysite>python manage.py runserver
Öffnen Sie jetzt Ihren Webbrowser und geben Sie "/admin/"Lokaler Domäne"- Zum Beispiel, http://127.0.0.1:8000/admin/ Sie sollten die Administrator-Anmeldeoberfläche sehen:
Da die Anmeldung in der Standardkonfiguration aktiviert ist, könnte die Anmeldeseite in Ihrer eigenen Sprache angezeigt werden, da die Übersetzung in der Standardkonfiguration aktiviert ist, könnte die Anmeldeseite in Ihrer eigenen Sprache angezeigt werden,
Versuchen Sie nun, sich mit dem Superbenutzerkonto, das Sie im letzten Schritt erstellt haben, anzumelden. Sie sollten die Startseite der Django-Verwaltung sehen:
Sie sollten einige editierbare Inhalte sehen: Gruppen und Benutzer. Sie werden durch django.contrib.auth, das Authentifizierungsframework von Django, bereitgestellt.
Wo ist die polls-Anwendung? Sie wird nicht auf der Indexseite der Verwaltung angezeigt.
Es gibt nur eine Aufgabe zu erledigen: Wir müssen dem Administrator mitteilen, dass das Question-Objekt eine Verwaltungsoberfläche hat. Dies zu erreichen, öffnen Sie polls/Ändern Sie die Datei admin.py wie folgt:
# Dateiname : example.py # Urheberrecht : 2020 Durch w3codebox # Autor durch: de.oldtoolbag.com # Datum : 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