Dieser Artikel ist der dritte Tag von Django Adventskalender 2019. (Adventskalender) ist der erste Beitrag.
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.
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.
https://github.com/shimayu22/fa_expects_app/tree/part1
python manage.py run server
http://127.0.0.1:8000/admin/fa_expects/faexpects/add/
Wenn Sie das Pulldown-Menü "Player" öffnen,
Es wird schlampig wie das Bild angezeigt.Ist es möglich, auf dem Verwaltungsbildschirm zu filtern?
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.
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,
Es wurden nur die als Pitcher registrierten Spieler angezeigt!
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.
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)
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".
Ich konnte nur den zweiten Baseman oder den Outfielder brillant darstellen!
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.)
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.
Ich habs gemacht.
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.
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?)
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