Django ORM - Einzeltabellen-Beispiel
Bevor Sie dieses Kapitel lesen, müssen SieDjango-Modellegelesen haben, die grundlegende Konfiguration durchführen und Lösungen für häufige Probleme verstehen.
Als Nächstes erstellen wir ein neues Projekt app01 (falls es bereits erstellt wurde, ignorieren Sie die folgenden Vorgänge):
django-admin.py startproject app01
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',
'app01', # 添加此项
)
Als Nächstes weisen Sie Django an, das pymysql-Modul zu verwenden, um eine Verbindung zur MySQL-Datenbank herzustellen:
Beispiel
import pymysql
pymysql.install_as_MySQLdb()
Modell erstellen
Fügen Sie die folgende Klasse in models.py im Projekt hinzu:
app01/models.py
id = models.AutoField(primary_key=True) # id wird automatisch erstellt und kann manuell geschrieben werden
title = models.CharField(max_length=32) # Buchtitel
price = models.DecimalField(max_digits=5, decimal_places=2) # Buchpreis
publish = models.CharField(max_length=32) # Verlagsname
pub_date = models.DateField() # Veröffentlichungszeit
Führen Sie dann den folgenden Befehl in der Befehlszeile aus:
$ python3 manage.py migrate # 创建表结构 $ python3 manage.py makemigrations app01 # 让 Django 知道我们在我们的模型有一些变更 $ python3 manage.py migrate app01 # 创建表结构
Häufige Fehlermeldungen
Wenn bei der Ausführung des obigen Befehls die folgende Fehlermeldung erscheint:

Der Grund dafür ist, dass MySQLclient derzeit nur bis Python 3.4 unterstützt. Wenn Sie also eine höhere Python-Version verwenden, müssen Sie es wie folgt ändern:
Verwenden Sie den Dateipfad in der Fehlermeldung, um die Datei base.py im Pfad ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql zu finden, 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__)

Klicken Sie im Allgemeinen auf die Dateipfadinformationen des Fehlercodes, und es wird automatisch zur Zeilennummer in der Fehlerdatei gesprungen. An dieser Stelle kommentieren wir die Codezeile aus, in der der Fehler auftritt.
Zu diesem Zeitpunkt erstellt das Datenbankbeispiel eine Tabelle namens app01_book.
Als Nächstes fügen wir die Dateien views.py und models.py im app01-Projekt hinzu. Die Verzeichnisstruktur des app01-Projekts:
app01 |-- app01 | |-- __init__.py | |-- __pycache__ | |-- asgi.py | |-- migrations | |-- models.py | |-- settings.py | |-- urls.py | |-- views.py | `-- wsgi.py
Zur Datenbank hinzufügen
Regelkonfiguration:
app01/urls.py: Dateicode:
Methode 1:Instanziiertes Objekt der Modellklasse
Sie müssen die Datei models.py aus der App importieren:
from app 目录 import models
Und nach dem Instanziieren des Objekts müssen Sieobject.save()ausführen. Erst dann können Sie erfolgreich Daten zur Datenbank hinzufügen.
app01/views.py: Dateicode:

Methode 2:Verwenden Sie die von objects im ORM bereitgestellte create-Methode, um dies zu erreichen (empfohlen)
app01/views.py: Dateicode:

Suche
Verwendung derall()-Methode zum Abfragen aller Inhalte.
Die zurückgegebenen Daten sind vom Typ QuerySet, ähnlich einer Liste, und enthalten nacheinander Modellklassenobjekte. Sie können Index-Subskripte verwenden, um die Modellklassenobjekte abzurufen.
app01/views.py: Dateicode:


filter()Methode zum Abfragen von Daten, die die Bedingungen erfüllen.
Die zurückgegebenen Daten sind vom Typ QuerySet, ähnlich wie eine Liste, und enthalten Modellklassenobjekte, die die Bedingungen erfüllen. Sie können Index-Subskripte verwenden, um die Modellklassenobjekte abzurufen.
pk=3 bedeutet Primärschlüssel=3, was äquivalent zu id=3 ist.
Da id in PyCharm eine besondere Bedeutung hat, nämlich die integrierte Funktion id(), die Speicheradressen betrachtet, verwenden Sie pk.
app01/views.py: Dateicode:

exclude() Die Methode wird verwendet, um Daten abzufragen, die die Bedingungen nicht erfüllen.
Die zurückgegebenen Daten sind vom Typ QuerySet, ähnlich einer Liste, und enthalten Objekte der Modellklasse, die die Bedingungen nicht erfüllen. Sie können Index-Indizes verwenden, um die Objekte der Modellklasse abzurufen.
app01/views.py: Dateicode:

get()Die Methode wird verwendet, um Objekte abzufragen, die die Bedingungen erfüllen, und ein Objekt der Modellklasse zurückzugeben. Es kann nur ein Objekt geben, das die Bedingungen erfüllt. Wenn mehr als ein Objekt den Filterbedingungen entspricht oder keines vorhanden ist, wird ein Fehler ausgelöst.
app01/views.py: Dateicode:

order_by()Die Methode wird verwendet, um die Abfrageergebnisse zu sortieren.
Die zurückgegebenen Daten sind vom Typ QuerySet, ähnlich einer Liste, und enthalten sortierte Modellklassenobjekte. Sie können Index-Subskripte verwenden, um die Modellklassenobjekte abzurufen.
Hinweis:
- a. Die Feldnamen der Parameter sollten in Anführungszeichen eingeschlossen werden.
- b. Für absteigende Reihenfolge fügen Sie ein Minuszeichen vor dem Feld hinzu-。
app01/views.py: Dateicode:

reverse()Die Methode wird verwendet, um die Abfrageergebnisse umzukehren.
Die zurückgegebenen Daten sind vom Typ QuerySet, ähnlich einer Liste, und enthalten umgekehrte Modellklassenobjekte. Sie können Index-Subskripte verwenden, um die Modellklassenobjekte abzurufen.
app01/views.py: Dateicode:

count() Die Methode wird verwendet, um die Anzahl der Datensätze abzufragen; die zurückgegebenen Daten sind eine ganze Zahl.
app01/views.py: Dateicode:

first()Die Methode gibt den ersten Datensatz zurück. Die zurückgegebenen Daten sind ein Objekt der Modellklasse, und Sie können auch eine Indexnotation verwenden.[0]。
app01/views.py: Dateicode:

Die Methode last() gibt den letzten Datensatz zurück. Die zurückgegebenen Daten sind ein Objekt der Modellklasse, und Sie können keine Indexnotation verwenden.[-1], das ORM hat keinen umgekehrten Index.
app01/views.py: Dateicode:

exists()Methode zur Bestimmung, ob Daten in der QuerySet-Liste der Abfrageergebnisse vorhanden sind.
Der zurückgegebene Datentyp ist boolesch. Wenn vorhanden, ist er true; wenn nicht vorhanden, ist er false.
Hinweis:Der Datentyp für die Beurteilung kann nur Daten vom Typ QuerySet sein, nicht Integer- oder Modellklassenobjekte.
Beispiel
from app01 import models
def add_book(request):
books = models.Book.objects.exists()
# Fehler: Der zu prüfende Datentyp kann nur Daten vom Typ QuerySet sein, nicht Integer.
books = models.Book.objects.count().exists()
# Fehler: Der ausgewertete Datentyp kann nur QuerySet-Daten sein, kein Objekt einer Modellklasse
books = models.Book.objects.first().exists()
return HttpResponse(<p>Suche erfolgreich!</p>)

values()Methode zum Abfragen von Daten aus Teilfeldern.
Die zurückgegebenen Daten sind vom Typ QuerySet, ähnlich einer Liste, und enthalten keine Modellklassenobjekte, sondern eine iterierbare Folge von Wörterbüchern. Die Schlüssel in den Wörterbüchern sind Felder, und die Werte sind Daten.
Hinweis:
- Die Feldnamen der Parameter sollten in Anführungszeichen gesetzt werden
- Wenn Sie Feldnamen und Daten verwenden möchten, verwenden Sievalues
-
Beispiel
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
# Daten für alle id- und price-Felder abfragen
books = models.Book.objects.values("pk","price")
print(books[0]["price"],type(books)) # Dies ruft die Daten des price-Feldes des ersten Datensatzes ab.
return HttpResponse(<p>Suche erfolgreich!</p>)

values_list()Methode zum Abfragen von Daten aus Teilfeldern.
Die zurückgegebenen Daten sind vom Typ QuerySet, ähnlich einer Liste, und enthalten keine Modellklassenobjekte, sondern Tupel, eins nach dem anderen. Jedes Tupel enthält die Daten, die den Abfragefeldern entsprechen.
Hinweis:
- Die Feldnamen der Parameter sollten in Anführungszeichen gesetzt werden
- Wenn Sie nur die Daten möchten, verwenden Sie values_list.
Beispiel
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
# Daten aller price- und publish-Felder abfragen
books = models.Book.objects.values_list("price","publish")
print(books)
print(books[0][0],type(books)) # Dies ruft die Daten des price-Feldes des ersten Datensatzes ab.
return HttpResponse(<p>Suche erfolgreich!</p>)

distinct() Methode zum Deduplizieren von Daten.
Die zurückgegebenen Daten sind vom Typ QuerySet.
Hinweis:
- Das Deduplizieren von Objekten einer Modellklasse ist sinnlos, weil jedes Objekt eine einzigartige Existenz ist.
- distinct() wird im Allgemeinen zusammen mit values oder values_list verwendet.
Beispiel
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
# Die Gesamtzahl der Verlage abfragen
books = models.Book.objects.values_list("publish").distinct() # Das Deduplizieren von Objekten einer Modellklasse ist sinnlos, weil jedes Objekt eine eigenständige Entität ist.
books = models.Book.objects.distinct()
return HttpResponse(<p>Suche erfolgreich!</p>)

filter()Die Methode basiert auf Fuzzy-Abfragen mit doppeltem Unterstrich (dasselbe gilt für exclude).
Hinweis:In filter kann der Operator nur das Gleichheitszeichen = verwenden; Sie können nicht das Größer-als-Zeichen >, das Kleiner-als-Zeichen < oder andere Symbole verwenden.
__in wird verwendet, um einen Bereich auszulesen; nach dem Gleichheitszeichen = steht eine Liste.
Beispiel
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
# Daten mit Preis 200 oder 300 abfragen
books = models.Book.objects.filter(price__in=[200,300])
return HttpResponse(<p>Suche erfolgreich!</p>)

__gtgrößer als, der Wert nach dem Gleichheitszeichen = ist eine Zahl.
# 查询价格大于200的数据 books = models.Book.objects.filter(price__gt=200)
__gtegrößer oder gleich, der Wert nach dem =-Zeichen ist eine Zahl.
# 查询价格大于等于200的数据 books = models.Book.objects.filter(price__gte=200)

__ltkleiner als, der Wert nach dem =-Zeichen ist eine Zahl.
# 查询价格小于300的数据 books=models.Book.objects.filter(price__lt=300)

__ltekleiner oder gleich, der Wert nach dem =-Zeichen ist eine Zahl.
# 查询价格小于等于300的数据 books=models.Book.objects.filter(price__lte=300)

__rangeZwischen ... , ein linksgeschlossenes und rechtsgeschlossenes Intervall; nach dem =-Zeichen steht eine Liste mit zwei Elementen.
books=models.Book.objects.filter(price__range=[200,300])

__containsenthält, der Wert nach dem =-Zeichen ist eine Zeichenkette.
books=models.Book.objects.filter(title__contains="菜")
__icontainsEnthält ohne Berücksichtigung der Groß-/Kleinschreibung; nach dem =-Zeichen steht eine Zeichenkette.
books=models.Book.objects.filter(title__icontains="python") # 不区分大小写

__startswithBeginnt mit dem angegebenen Zeichen; nach dem =-Zeichen steht eine Zeichenkette.
books=models.Book.objects.filter(title__startswith="菜")

__endswithEndet mit dem angegebenen Zeichen; nach dem =-Zeichen steht eine Zeichenkette.
books=models.Book.objects.filter(title__endswith="教程")

__yearEs ist das Jahr des Datentyps DateField; nach dem =-Zeichen steht eine Zahl.
books=models.Book.objects.filter(pub_date__year=2008)

__monthEs ist der Monat des Datentyps DateField; nach dem =-Zeichen steht eine Zahl.
books=models.Book.objects.filter(pub_date__month=10)

__dayEs ist der Tag des Datentyps DateField; nach dem =-Zeichen steht eine Zahl.
books=models.Book.objects.filter(pub_date__day=01)

Delete
Methode 1:Verwenden vonobject.delete() der Modellklasse。
Rückgabewert:Ein Tupel; das erste Element ist die Anzahl der betroffenen Zeilen.
books=models.Book.objects.filter(pk=8).first().delete()

Methode 2: Verwendung von QuerySettypeData.delete()(Empfohlen)
Rückgabewert:Ein Tupel; das erste Element ist die Anzahl der betroffenen Zeilen.
books=models.Book.objects.filter(pk__in=[1,2]).delete()
Hinweis:
- a. Wenn Django Daten löscht, imitiert es das Verhalten der SQL-Beschränkung ON DELETE CASCADE, was bedeutet, dass beim Löschen eines Objekts auch die zugehörigen Fremdschlüsselobjekte gelöscht werden.
- Die Methode delete() ist eine Methode des QuerySet-Datentyps, gilt aber nicht für den Manager selbst. Das heißt, wenn Sie alle Daten löschen möchten, können Sie nicht 'all' weglassen.
books=models.Book.objects.delete() # 报错 books=models.Book.objects.all().delete() # 删除成功
ändern
Methode 1:
模型类的对象.属性 = 更改的属性值 模型类的对象.save()
Rückgabewert:Das Objekt der Modellklasse, die bearbeitet wird.
books = models.Book.objects.filter(pk=7).first() books.price = 400 books.save()

Methode 2:QuerySet-Typdaten .update(Feldname = geänderte Daten) (empfohlen)
Rückgabewert:Ganzzahl, die Anzahl der betroffenen Zeilen
Beispiel
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
books = models.Book.objects.filter(pk__in=[7,8]).update(price=888)
return HttpResponse(books)
Weitere Erweiterungen