[PYTHON] [Django lernt mit der Klinge des Teufels] So erhalten Sie einen Abfragesatz für die Vorwärts- / Rückwärtsreferenz

Verwenden Sie Django?

Django ist mit Pythons Webframework vertraut. Laut "SimilarTech, das zeigt, wann und welche Tools auf welcher Site eingeführt wurden" scheint Django auf dem Vormarsch zu sein, obwohl sein Anteil in den meisten Ländern Ruby On Rails unterlegen ist. image.png

Django VS Ruby On Rails

Die Zielgruppe dieses Artikels sind übrigens diejenigen, die Django in gewissem Umfang verwendet haben und diejenigen, die das MTV- (oder MVC-) Modell in gewissem Maße verstehen. Wenn Sie es noch nicht berührt haben, beginnen Sie mit dem Tutorial auf der offiziellen Website.

Vorwärts- und Rückwärtsreferenzen

Angenommen, Sie haben die folgenden drei Modelle (Dämonenkiller, Klasse und Atmung).

kimetsu_no_models.py


from django.db import models


class KisatsuMember(models.Model):
    """Dämonenschlachtmodell"""
    id = models.UUIDField()
    #Sex ex)竈 MON, meine Frau, Schmetterling
    last_name = models.CharField(max_length=20)
    #Name ex)Sumijiro, Zeni, Shinobu
    first_name = models.CharField(max_length=20)
    #Klasse
    rank = models.ForeignKey(Rank, on_delete=models.PROTECT)
    #Atem
    breath = models.ForeignKey(Breath, on_delete=models.PROTECT, null=True)
    #Aktives Flag
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = 'kisatsu_member'


class Rank(models.Model):
    """Klassenmodell"""
    id = models.UUIDField()
    #Klassenname ex)Säule, 癸
    name = models.CharField(max_length=10)

    class Meta:
        db_table = 'rank'


class Breath(models.Model):
    """Atemmodell"""
    id = models.UUIDField()
    #Atemname ex)Wasser, Donner, Tier
    name = models.CharField(max_length=10)
    #Anzahl der Typen z) 6, 10, 11
    number_of_types = models.IntegerField()

    class Meta:
        db_table = 'breath'

Sequentielles Referenzbeispiel

Das Referenzieren der Werte in der Tabelle von Eltern zu Kind, z. B. vom Dämonenkiller bis zum Atmen, wird als "Vorwärtsreferenz" bezeichnet. Wenn Sie beispielsweise die Anzahl der Nachnamen, Vornamen und Arten von Dämonenschlachtern ermitteln möchten, die den Atem von "Wasser" der Reihe nach verwenden, ist dies wie folgt.

mizu_no_views.py


water_breath_member = KisatsuMember.objects \
    .filter(breath__name="Wasser") \
    .values("last_name",
            "first_name",
            "breath__number_of_types")
print(water_breath_user)
# <QuerySet [{'last_name': 'Tor', 'first_name': 'Sumijiro', 'breath__number_of_types': 10},
#            {'last_name': 'Schuppenwasserfall', 'first_name': 'Sakonji', 'breath__number_of_types': 10},
#            {'last_name': 'Tomioka', 'first_name': 'Yoshiyuki', 'breath__number_of_types': 11}]>

Abfrage veröffentlichen

mizu_no.sql


SELECT
    kisatsu_member.last_name,
    kisatsu_member.first_name,
    breath.number_of_types
FROM
    kisatsu_member
    INNER JOIN
        breath
    ON  kisatsu_member.breath_id = breath.id
WHERE
    breath.name = 'Wasser'
;

Beispiel für umgekehrte Referenz

Andererseits werden Verweise von Kindern auf Eltern und von Klassen auf Dämonenschlächter als "umgekehrte Verweise" bezeichnet. Versuchen wir nun eine etwas kompliziertere Erfassungsmethode. Wenn Sie einen anderen atmenden Namen als "Wasser" eines Dämonenschlachters erhalten möchten, dessen Rang "Säule" und "aktiv" ist, lautet dieser wie folgt. Die umgekehrte Referenz ist Miso, da sie die Tabellennamen ohne Unterstrich verbindet.

hashira_no_views.py


active_hashira_breathes = Rank.objects \
    .filter(name="Säule",
            kisatsumember__is_active=True) \
    .exclude(kisastumember__breath__name="Wasser") \
    .values("kisastumember__breath__name")
print(active_hashira_breathes)
# <QuerySet [{'kisastumember__breath__name': 'Flamme'},
#            {'kisastumember__breath__name': 'Liebe'},
#            {'kisastumember__breath__name': 'Dunst'}...]>

Abfrage veröffentlichen

hashira_no.sql


SELECT
    breath.name
FROM
    `rank`
    INNER JOIN
        kisatsu_member
    ON  kisatsu_member.rank_id = `rank`.id
    INNER JOIN
        breath
    ON  kisatsu_member.breath_id = breath.id
WHERE
    `rank`.name = 'Säule'
AND kisatsu_member.is_active = 1
AND breath.name <> 'Wasser'
;

Sie müssen einen Pfad beherrschen

Ich kann nur in Python schreiben, aber ich werde mich weiterhin dem widmen!

image.png

Recommended Posts

[Django lernt mit der Klinge des Teufels] So erhalten Sie einen Abfragesatz für die Vorwärts- / Rückwärtsreferenz
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Wie fange ich mit Django an?
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Der einfachste Weg, um mit Django zu beginnen
So entwickeln Sie eine Cart-App mit Django
Berechnen Sie mit scipy.optimize die optimale Lösung, um einen Weltrekord für zehn Arten von Wettbewerb aufzustellen
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
So legen Sie einen freigegebenen Ordner mit dem Host-Betriebssystem in CentOS7 auf Virtual BOX fest
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
So erhalten Sie einen angemeldeten Benutzer mit Djangos forms.py
Übergang zum Update-Bildschirm mit dem Django-Tag
So legen Sie die Entwicklungsumgebung für jedes Projekt mit VSCode + Python-Erweiterung + Miniconda fest
So verweisen Sie auf statische Dateien in einem Django-Projekt
Führen Sie das Programm aus, ohne eine Python-Umgebung zu erstellen! !! (Erste Schritte mit Google Colaboratory)
So erhalten Sie mit einer vielseitigen Methode nur die erforderlichen Daten aus der strukturierten Datengruppe
So legen Sie Variablen fest, die in der gesamten Django-App verwendet werden können ~ Praktisch für Vorlagen usw. ~
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Eine Geschichte über den Umgang mit dem CORS-Problem
So gelangen Sie mit Vagrant in die Python-Entwicklungsumgebung
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
Für diejenigen, die nicht wissen, wie man ein Passwort mit Jupyter auf Docker festlegt
So legen Sie eine Verknüpfung fest, um in IBus zwischen voller und halber Breite zu wechseln
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
So erhalten Sie den NTP-Servernamen per DHCP und legen ihn fest
So erhalten Sie alle möglichen Werte in einem regulären Ausdruck
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
So erhalten Sie die ID von Type2Tag NXP NTAG213 mit nfcpy
So bringen Sie den Druckertreiber für Oki Mac in Linux
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
So erhalten Sie das Verzeichnis, in dem die mit Pyinstaller erstellte EXE-Datei vorhanden ist
So erstellen Sie eine Bezeichnung (Maske) für die Segmentierung mit labelme (semantische Segmentierungsmaske)
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
[Python] So erhalten Sie mit Enum einen Wert mit einem anderen Schlüssel als dem Wert
So senden Sie eine Anfrage mit Python an die DMM (FANZA) -API
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
So erhalten Sie die Python-Version
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
Holen Sie sich die Abfragezeichenfolge (Abfragezeichenfolge) mit Django
[Python] Was ist ein formales Argument? So stellen Sie den Anfangswert ein
Überlegen Sie, wie Sie einen Filter mit den Shotgun API-Contact-Versionen schreiben
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
So finden Sie den Ansichtsnamen mit dem Namespace über die URL (path_info) in Django
Wie man die anfängliche Population mit einem genetischen Algorithmus unter Verwendung von DEAP fixiert
[Python] So stellen Sie mit Selenium die (Client-) Fenstergröße im Browser ein
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
[Entwicklungsumgebung] So erstellen Sie einen Datensatz in der Nähe der Produktionsdatenbank
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Ein Leitfaden für IoT mit MicroPython bis zur letzten Minute
So führen Sie eine arithmetische Verarbeitung mit der Django-Vorlage durch