Django-Modelle

Django bietet hervorragende Unterstützung für verschiedene Datenbanken, darunter: PostgreSQL, MySQL, SQLite, Oracle.

Django bietet eine einheitliche Aufruf-API für diese Datenbanken. Wir können verschiedene Datenbanken entsprechend unseren Geschäftsanforderungen auswählen.

MySQL ist die am häufigsten verwendete Datenbank in Webanwendungen. In diesem Kapitel verwenden wir MySQL als Beispiel zur Demonstration. Sie können dasMySQL-Tutorialdieser Website verwenden, um mehr über die Grundlagen von MySQL zu erfahren.

Wenn Sie den mysql-Treiber nicht installiert haben, können Sie den folgenden Befehl ausführen, um ihn zu installieren:

sudo pip3 install pymysql

Django ORM

Django-Modelle verwenden das integrierte ORM.

Objekt-relationales Mapping (kurz ORM) wird verwendet, um die Umwandlung zwischen Daten unterschiedlicher Systemtypen in objektorientierten Programmiersprachen zu implementieren.

ORM fungiert als Brücke zwischen der Geschäftslogikschicht und der Datenbankschicht.

ORM persistiert Objekte in einem Programm automatisch in der Datenbank, indem es Metadaten verwendet, die die Zuordnung zwischen Objekten und der Datenbank beschreiben.

Vorteile der Verwendung von ORM:

  • Verbessert die Entwicklungseffizienz.
  • Verschiedene Datenbanken können reibungslos gewechselt werden.

Nachteile der Verwendung von ORM:

  • Wenn ORM-Code in SQL-Anweisungen umgewandelt wird, dauert dies eine gewisse Zeit, und die Ausführungseffizienz wird verringert.
  • Wenn man lange Zeit ORM-Code schreibt, verringert dies die Fähigkeit, SQL-Anweisungen zu schreiben.

ORM-Parsing-Prozess:

  • 1. ORM wandelt Python-Code in SQL-Anweisungen um.
  • 2. Die SQL-Anweisung wird über pymysql an den Datenbankserver übertragen.
  • 3. Die SQL-Anweisung in der Datenbank ausführen und das Ergebnis zurückgeben.

ORM-Zuordnungstabelle:


Datenbankkonfiguration

Wie Django die MySQL-Datenbank verwendet

Syntax zum Erstellen einer MySQL-Datenbank (ORM kann nicht auf Datenbankebene arbeiten, sondern nur auf Datentabellen):

create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

Zum Beispiel erstellen wir eine Datenbank namens example und geben die Kodierung als utf8 an:

create database example default charset=utf8;   

Suchen Sie in der Datei settings.py des Projekts den Konfigurationseintrag DATABASES und ändern Sie dessen Informationen zu:

HelloWorld/HelloWorld/settings.py: Code der Datei:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Datenbank-Engine 'NAME': 'example', # Datenbankname 'HOST': '127.0.0.1', # Datenbankadresse, IP-Adresse des lokalen Rechners 127.0.0.1 'PORT': 3306, # Port 'USER': 'root', # Datenbank-Benutzername 'PASSWORD': '123456', # Datenbank-Passwort } }

Wenn Sie Python2.x verwenden, werden hier chinesische Kommentare hinzugefügt, daher müssen Sie am Anfang der Datei HelloWorld/settings.py Folgendes hinzufügen:# -*- coding: UTF-8 -*-。

Das Obige enthält den Datenbanknamen und die Benutzerinformationen, die mit den entsprechenden Datenbank- und Benutzereinstellungen in MySQL übereinstimmen. Django verbindet sich gemäß dieser Einstellung mit der entsprechenden Datenbank und dem entsprechenden Benutzer in MySQL.

Als Nächstes weisen Sie Django an, das Modul pymysql zur Verbindung mit der MySQL-Datenbank zu verwenden:

Beispiel

# Module importieren und in __init__.py im selben Verzeichnis wie settings.py konfigurieren
import pymysql
pymysql.install_as_MySQLdb()

Modell definieren

App erstellen

Django schreibt vor, dass Sie eine App erstellen müssen, wenn Sie Modelle verwenden möchten. Wir verwenden den folgenden Befehl, um eine App namens TestModel zu erstellen:

django-admin startapp TestModel

Die Verzeichnisstruktur ist wie folgt:

HelloWorld
|-- HelloWorld
|-- manage.py
...
|-- TestModel
|   |-- __init__.py
|   |-- admin.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py

Wir ändern die Datei TestModel/models.py, der Code lautet wie folgt:

HelloWorld/TestModel/models.py: Datei-Code:

# models.py from django.db import models class Test(models.Model): name = models.CharField(max_length=20)

Der obige Klassenname stellt den Datenbanktabellennamen dar, und er erbt von models.Model. Die Felder innerhalb der Klasse stellen die Felder (name) in der Datentabelle dar, und die Datentypen werden durch CharField (entspricht varchar), DateField (entspricht datetime) bestimmt. Der Parameter max_length begrenzt die Länge.

Suchen Sie als Nächstes den Eintrag INSTALLED_APPS in settings.py, wie folgt:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',               # 添加此项
)

In der Befehlszeile ausführen:

$ python3 manage.py migrate   # 创建表结构

$ python3 manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate TestModel   # 创建表结构

Wenn Sie die Worte "Creating table..." in ein paar Zeilen sehen, wurde Ihre Datentabelle erstellt.

Creating tables ...
……
Creating table TestModel_test  #我们自定义的表
……

Die Struktur des Tabellennamens ist: Anwendungsname_Klassenname (z. B. TestModel_test).

Hinweis:Obwohl wir in models keinen Primärschlüssel für die Tabelle festgelegt haben, fügt Django automatisch eine id als Primärschlüssel hinzu.

Häufige Fehlermeldungen

Wenn bei der Ausführung des obigen Befehls die folgende Fehlermeldung erscheint:

Der Grund ist, dass MySQLclient derzeit nur Python 3.4 unterstützt. Wenn Sie also eine höhere Version von Python verwenden, müssen Sie wie folgt ändern:

Suchen Sie über den Dateipfad in der Fehlermeldung die Datei base.py im Pfad ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql und kommentieren Sie diese beiden Codezeilen aus (der Code befindet sich am Anfang der Datei):

if version < (1, 3, 13):
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

Im Allgemeinen klicken Sie auf die Dateipfadinformationen des Codes in der Fehlermeldung, und es springt automatisch zur Zeilennummer in der Fehlerdatei. An dieser Stelle kommentieren wir die Codezeile aus, die den Fehler gemeldet hat.

Wenn die folgende Fehlermeldung erscheint:

Wir klicken auf die Dateipfadangabe des Codes im Fehler, springen zur Zeilennummer in der Fehlerdatei, und an dieser Stelle fügen wir Folgendes vor der fehlerhaften Codezeile hinzu:

query = query.encode()


Datenbankoperation

Als Nächstes fügen wir die Datei testdb.py (unten beschrieben) im Verzeichnis HelloWorld hinzu und ändern urls.py:

HelloWorld/HelloWorld/urls.py: Dateicode:

from django.urls import path from . import views,testdb urlpatterns = [ path('example/', views.example), path('testdb/', testdb.testdb), ]

Daten hinzufügen

Um Daten hinzuzufügen, müssen Sie zuerst ein Objekt erstellen und dann die Funktion save ausführen, was dem INSERT in SQL entspricht:

HelloWorld/HelloWorld/testdb.py: Dateicode:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Datenbankoperation def testdb(request): test1 = Test(name='example') test1.save() return HttpResponse("<p>Daten erfolgreich hinzugefügt!</p>")

Besuchen Siehttp://127.0.0.1:8000/testdbDann sehen Sie einen Hinweis, der anzeigt, dass die Daten erfolgreich hinzugefügt wurden.

Das Ausgabeergebnis ist wie folgt:

Daten abrufen

Django bietet mehrere Möglichkeiten, Datenbankinhalte abzurufen, wie im folgenden Code gezeigt:

HelloWorld/HelloWorld/testdb.py: Dateicode:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Datenbankoperation def testdb(request): # Initialisieren response = "" response1 = "" # Verwenden Sie die all()-Methode des objects-Modell-Managers, um alle Datenzeilen abzurufen, äquivalent zu SELECT * FROM in SQL. listTest = Test.objects.all() # filter ist äquivalent zu WHERE in SQL und kann Bedingungen festlegen, um Ergebnisse zu filtern response2 = Test.objects.filter(id=1) # Ein einzelnes Objekt abrufen response3 = Test.objects.get(id=1) # Begrenzen Sie die zurückgegebenen Daten, äquivalent zu OFFSET 0 LIMIT 2 in SQL; Test.objects.order_by('name')[0:2] #Daten sortieren Test.objects.order_by("id") # Die obigen Methoden können verkettet werden Test.objects.filter(name="example").order_by("id") # Alle Daten ausgeben for var in listTest: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")

Daten aktualisieren

Um Daten zu ändern, können Sie save() oder update() verwenden:

HelloWorld/HelloWorld/testdb.py: Dateicode:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Datenbankoperation def testdb(request): # Das name-Feld von einem mit id=1 ändern, dann speichern, entspricht UPDATE in SQL test1 = Test.objects.get(id=1) test1.name = 'Google' test1.save() # Ein anderer Weg #Test.objects.filter(id=1).update(name='Google') # Alle Spalten ändern # Test.objects.all().update(name='Google') return HttpResponse("<p>Erfolgreich geändert</p>")

Daten löschen

Um ein Objekt in der Datenbank zu löschen, müssen Sie nur die delete()-Methode dieses Objekts aufrufen:

HelloWorld/HelloWorld/testdb.py: Dateicode:

# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # Datenbankoperation def testdb(request): # Die Daten mit id=1 löschen test1 = Test.objects.get(id=1) test1.delete() # Eine andere Möglichkeit # Test.objects.filter(id=1).delete() # Alle Daten löschen # Test.objects.all().delete() return HttpResponse("<p>Erfolgreich gelöscht</p>")
Weitere Erweiterungen