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

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

Modell erstellen

Fügen Sie die folgende Klasse in models.py im Projekt hinzu:

app01/models.py

class Book(models.Model):
    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:

from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('add_book/', views.add_book), ]

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): book = models.Book(title="Example",price=300,publish="Rookie Press",pub_date="2008-8-8") book.save() return HttpResponse("<p>Daten erfolgreich hinzugefügt!</p>")

Methode 2:Verwenden Sie die von objects im ORM bereitgestellte create-Methode, um dies zu erreichen (empfohlen)

app01/views.py: Dateicode:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.create(title="Buddhas Palme",price=200,publish="Kung-Fu-Verlag",pub_date="2010-10-10") print(books, type(books)) # Book-Objekt (18) return HttpResponse("<p>Daten erfolgreich hinzugefügt!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.all() print(books,type(books)) # QuerySet-Typ, ähnlich wie eine Liste. Beim Zugriff auf die URL werden Daten im Kommandozeilenfenster angezeigt. return HttpResponse("<p>Suche erfolgreich!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.filter(pk=5) print(books) print("//////////////////////////////////////") books = models.Book.objects.filter(publish='Rookie Press', price=300) print(books, type(books)) # QuerySet-Typ, ähnlich wie eine Liste. return HttpResponse("<p>Suche erfolgreich!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.exclude(pk=5) print(books) print("//////////////////////////////////////") books = models.Book.objects.exclude(publish='Rookie Press', price=300) print(books, type(books)) # QuerySet-Typ, ähnlich wie eine Liste. return HttpResponse("<p>Suche erfolgreich!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.get(pk=5) books = models.Book.objects.get(pk=18) # Fehler, kein Objekt entspricht den Bedingungen books = models.Book.objects.get(price=200) # Fehler: Mehr als ein passendes Objekt gefunden. print(books, type(books)) # Objekt der Modellklasse return HttpResponse("<p>Suche erfolgreich!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.order_by("price") # Alle abfragen, sortiert nach Preis aufsteigend books = models.Book.objects.order_by("-price") # Alle abfragen, sortiert nach Preis absteigend return HttpResponse("<p>Suche erfolgreich!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): # Nach Preis aufsteigend sortieren: absteigend sortieren, dann umkehren. books = models.Book.objects.order_by("-price").reverse() return HttpResponse("<p>Suche erfolgreich!</p>")

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

app01/views.py: Dateicode:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.count() # Anzahl aller Daten abfragen books = models.Book.objects.filter(price=200).count() # Anzahl der Datensätze abfragen, die die Bedingungen erfüllen return HttpResponse("<p>Suche erfolgreich!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.first() # Den ersten Datensatz aller Daten zurückgeben return HttpResponse("<p>Suche erfolgreich!</p>")

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:

from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.last() # Den letzten Datensatz aus allen Daten zurückgeben return HttpResponse("<p>Suche erfolgreich!</p>")

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 django.shortcuts import render,HttpResponse
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