[PYTHON] So filtern Sie die externen Schlüssel, die auf dem Django-Verwaltungsbildschirm ausgewählt werden können

Dieser Artikel ist der dritte Tag von Django Adventskalender 2019. (Adventskalender) ist der erste Beitrag.

Einführung

Ich bin ein Nicht-Ingenieur, der seit etwa einem Monat mit Django persönlich Apps erstellt. Wenn ich in dieser App einen externen Schlüssel verwendet habe, wurden beim Öffnen des Pulldowns mehr als 100 Elemente angezeigt Ich fragte mich, ob ich es irgendwie quetschen könnte.

Zum Abschluss können Sie limit_choices_to verwenden, um die von externen Schlüsseln angezeigten Datensätze zu filtern. Lassen Sie uns tatsächlich eine App erstellen und sie ausprobieren, um zu sehen, wie sie verwendet wird.

Die App, die ich für diesen Artikel gemacht habe

Ich habe eine einfache App zur Erklärung erstellt. Nur Modell. Das Thema ist übrigens eine Anwendung, die die Vorhersage registriert, zu welchem Team die Spieler, die 2019 den FA erworben haben, gehen werden. Es ist fast entschieden, also nicht praktisch! https://github.com/shimayu22/fa_expects_app/

In der FaExpects-Tabelle wird die Players-Tabelle als externer Schlüssel festgelegt, damit registrierte Spieler sie aus dem Pulldown-Menü auswählen können. Spielerdaten sind ebenfalls verfügbar, sodass Sie sie einfach durch Lesen ausprobieren können. Informationen zur Verwendung finden Sie unter README.

Dinge wie dieses

https://github.com/shimayu22/fa_expects_app/tree/part1

スクリーンショット 2019-11-23 23.01.18.png

Ist es möglich, auf dem Verwaltungsbildschirm zu filtern?

Verwenden Sie limit_choices_to

Aus ForeignKey.limit_choices_to in der Django-Dokumentation

Legen Sie eine Grenze für die in diesem Feld verfügbaren Auswahlmöglichkeiten fest, wenn dieses Feld mit ModelForm oder admin gerendert wird (standardmäßig können alle Objekte im Abfragesatz ausgewählt werden). Sie können entweder ein Wörterbuch, ein Q-Objekt oder ein aufrufbares Objekt verwenden, das ein Wörterbuch oder ein Q-Objekt zurückgibt. (Google Übersetzung)

Sie können also limit_choices_to verwenden, um die auswählbaren Elemente zu filtern.

Ich habe es tatsächlich versucht

https://github.com/shimayu22/fa_expects_app/tree/part2

Limit_choices_to wurde zur player_id von FaExpects hinzugefügt.

models.py


    player_id = models.ForeignKey(
        Players,
        on_delete=models.CASCADE,
        verbose_name="Spieler",
        limit_choices_to={"position":1,}
    )

Diesmal kann nur die Position "1" (Werfer) ausgewählt werden. mit diesem, http://127.0.0.1:8000/admin/fa_expects/faexpects/add/ Wenn Sie das Pulldown-Menü "Player" öffnen,

スクリーンショット 2019-11-24 22.52.48.png

Es wurden nur die als Pitcher registrierten Spieler angezeigt!

Verwenden Sie Suchbegriffe

Im obigen Beispiel können Sie durch Gleichheit wie "Position == 1" eingrenzen, aber mit dem Suchschlüsselwort können Sie mit den obigen und den folgenden eingrenzen.

models.py


    player_id = models.ForeignKey(
        Players,
        on_delete=models.CASCADE,
        verbose_name="Spieler",
        limit_choices_to={"position": 1,
                          "age__lt": 33}
    )

Das Obige legt "Position == 1 und Alter <33" (Werfer und unter 33 Jahre alt) fest. Wenn Sie dem Elementnamen "Alter" "__lt" (zwei Unterstriche) hinzufügen, wird die Bedingung "kleiner als" hinzugefügt.

スクリーンショット 2019-11-24 23.01.15.png

Es stehen weniger Spieler zur Auswahl! Die folgenden Artikel sind für andere Schlüsselwörter sehr gut organisiert.

Referenz: [Zusammenfassung der Django-Datenbankoperationen # Liste der Suchschlüsselwörter](https://qiita.com/okoppe8/items/66a8747cf179a538355b#%E6%A4%9C%E7%B4%A2%E3%82%AD%E3 % 83% BC% E3% 83% AF% E3% 83% BC% E3% 83% 89% E3% 81% AE% E4% B8% 80% E8% A6% A7)

Verwenden Sie das Q-Objekt

Bisher wurden Suchbedingungen im Wörterbuchtyp angegeben, sie können jedoch auch im Q-Objekt angegeben werden.

models.py


from django.db.models import Q

~~~Kürzung~~~
    player_id = models.ForeignKey(
        Players,
        on_delete=models.CASCADE,
        verbose_name="Spieler",
        limit_choices_to=Q(position=4) | Q(position=7),
    )

Für Q-Objekte können Sie solche ODER-Bedingungen angeben. Oben bedeutet dies "die Position ist die zweite Basis oder der zweite Outfielder".

スクリーンショット 2019-11-24 23.37.01.png

Ich konnte nur den zweiten Baseman oder den Outfielder brillant darstellen!

Erstellen Sie ein Wörterbuch für limit_choices_to

https://github.com/shimayu22/fa_expects_app/tree/part3

Wenn es solide geschrieben ist, ist es nicht flexibel, also werde ich einen Wörterbuchtyp mit einer Funktion erstellen und ihn übergeben. Dieses Mal habe ich, um es knusprig zu machen, eine Tabelle zur Angabe der Bedingungen erstellt. Ich füge die RequestedConditions Klasse zu Models.py hinzu. (Da es lang ist, überprüfen Sie bitte Models.py)

Dann habe ich eine Funktion erstellt, um ein Wörterbuch für limit_choices_to aus dem neuesten Datensatz in der Tabelle "RequestedConditions" zu erstellen.

Models.py


~~~ Abkürzung ~~~

def set_players_condition():
    condition =  RequestedConditions.objects.latest('pk')
    condition_dict = {}
    if condition.age > 0:
        condition_dict["age__lt"] = condition.age
    
    if condition.position > 0:
        condition_dict["position"] = condition.position
    
    if condition.dominant_hand > 0:
        condition_dict["dominant_hand"] = condition.dominant_hand

    return condition_dict

~~~ Abkürzung ~~~

Zuerst, http://127.0.0.1:8000/admin/fa_expects/requestedconditions/add/ Stellen Sie "Alter", "Position" und "dominante Hand" ein und speichern Sie. (Wenn Sie nicht alle festlegen, werden alle angezeigt.)

スクリーンショット 2019-11-26 23.31.31.png

Nach der Registrierung http://127.0.0.1:8000/admin/fa_expects/faexpects/add/ Wenn Sie sich die Spieler ansehen, werden nur die Spieler angezeigt, die die Bedingungen erfüllen.

スクリーンショット 2019-11-26 23.31.57.png

Ich habs gemacht.

abschließend

Wenn Sie nur etwas mit dem Modell machen möchten, können Sie es so machen. Es scheint, dass Sie es flexibler machen können, indem Sie Q-Objekte kombinieren. Bitte spielen Sie damit herum und probieren Sie es aus.

Bonus

Es kann natürlich sein, wenn Sie ruhig denken, limit_choices_to={"age__lt":RequestedConditions.objects.latest('pk').age} Wenn Sie so etwas schreiben, wird bei der ersten Migration die Fehlermeldung "Es gibt keine solche Tabelle" angezeigt. Sora (wenn ich versuche, auf eine Tabelle zu verweisen, die noch nicht erstellt wurde) Ja (ich erhalte eine Fehlermeldung) (Ist das nicht natürlich?)

Weniger relevante Ergänzung

  1. Nicht die Spieler, die FA deklariert haben, sondern die Spieler, die FA richtig gemacht haben (es tut mir leid, wenn ein Fehler vorliegt)
  2. Suzuki Daichi (b) ist zu stark geschützt, daher habe ich beschlossen, es 2019 am meisten zu schützen (1).
  3. Ich bin ein kleiner Schinken
  4. Ich freue mich auf die nächste Saison!

Referenz

Zusammenfassung der Django-Datenbankoperationen

Auch die folgenden Artikel waren für Django im Allgemeinen hilfreich. Vielen Dank! [Python] Django-Lernprogramm - Schnellste Erstellung einer Business-Webanwendung für allgemeine Zwecke [Django] Modellfeldeinstellungsvorlage

Recommended Posts

So filtern Sie die externen Schlüssel, die auf dem Django-Verwaltungsbildschirm ausgewählt werden können
So registrieren Sie nur eine Daten auf dem Django-Verwaltungsbildschirm
So legen Sie Variablen fest, die in der gesamten Django-App verwendet werden können ~ Praktisch für Vorlagen usw. ~
Die Geschichte, dass "calendar.day_abbr" auf dem Admin-Bildschirm von django nicht aktualisiert werden konnte
Hinzufügen einer Pre-Save-Verarbeitung beim Hinzufügen eines Objekts auf der Django-Verwaltungssite
[Django] Über Benutzer, die für Vorlagen verwendet werden können
So lösen Sie das Problem, dass Videoinhalte unter Firefox für Linux nicht abgespielt werden können
Python-Standardmodul, das in der Befehlszeile verwendet werden kann
Können Kalman-Filter verwendet werden, um Aktienentwicklungen vorherzusagen?
Blenden Sie die Warnung aus, dass zsh auf dem Mac standardmäßig verwendet werden kann
Wie man einen Janken-Bot macht, der leicht bewegt werden kann (Kommentar)
TLE schien beängstigend zu sein, je nachdem, wie die Eingabe empfangen wurde
So überprüfen Sie die Version von Django
So lösen Sie das Problem, dass nur der Prozess übrig bleibt, wenn Sie auf dem Imshow-Bildschirm von OpenCV auf Kreuz drücken
So installieren Sie die Python-Bibliothek, die von Pharmaunternehmen verwendet werden kann
So drucken Sie Debug-Meldungen auf der Django-Konsole
Implementieren Sie die Autovervollständigungsfunktion auf dem Django-Verwaltungsbildschirm
Passen Sie die Modellseite des Django-Verwaltungsbildschirms an
Hinweise zur Verwendung von StatsModels, die lineare Regression und GLM in Python verwenden können
So erstellen Sie eine Eigenschaft von Beziehungen, die durch bestimmte Bedingungen vorab abgerufen werden kann
So lösen Sie das Problem, dass der Anmeldebildschirm unter Ubuntu 19.04 nicht für immer angezeigt wird, da er beim Start beim Logo stoppt
Einfache Statistiken, mit denen die Auswirkungen von Maßnahmen auf EG-Standorte und Codes analysiert werden können, die in Jupyter-Notebooks verwendet werden können
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
So stellen Sie eine Django-Anwendung in der Alibaba-Cloud bereit
So lösen Sie die rekursive Funktion, die abc115-D gelöst hat
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Verwendung von Django mit Google App Engine / Python
Übergang zum Update-Bildschirm mit dem Django-Tag
Wie man Python auf Android genießt !! Programmieren für unterwegs !!
So führen Sie Django unter IIS auf einem Windows-Server aus
Qiita kann jetzt auf der Konsole (Shell) angezeigt werden.
Deep Learning Kurs, der vor Ort zerquetscht werden kann
[Django] So leiten Sie nicht angemeldete Benutzer zur Anmeldeseite um
Listen Sie die Klassen auf, auf die ObjCClass verweisen kann
Wie man mit dem Phänomen umgeht, dass Python (Jupyter Notebook) auf WSL ausgeführt wird, wird abgebrochen
Problemumgehung für Pandas 1.1.0 und höher Build-Fehler unter Alpine Linux
So richten Sie einen einfachen SMTP-Server ein, der lokal in Python getestet werden kann
[Django] Feldnamen, die für das Benutzermodell, die Benutzerregistrierung und die Anmeldemethoden verwendet werden können
So zeigen Sie Hover-Text und Text an, der ausgeführt werden kann, indem Sie mit dem Minecraft-Plug-In klicken
So gehen Sie mit dem Fehler um, dass der MySQL-Container von Docker in der Docker Toolbox nicht gestartet werden kann
So löschen Sie "(base)", das im Terminal angezeigt wird, wenn Anaconda auf einem Mac installiert ist
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können