Cet article est le troisième jour du Calendrier de l'Avent Django 2019. (Calendrier de l'Avent) est le premier article.
Je suis un non-ingénieur qui crée personnellement des applications avec Django depuis environ un mois. Lorsque j'ai utilisé une clé externe dans cette application, lorsque j'ai ouvert le menu déroulant, plus de 100 éléments étaient affichés, donc Je me suis demandé si je pouvais le presser d'une manière ou d'une autre.
Pour conclure d'abord, vous pouvez utiliser limit_choices_to
pour filtrer les enregistrements affichés par des clés externes.
Créons en fait une application et essayons-la pour voir comment l'utiliser.
J'ai créé une application simple pour l'explication. Seulement modèle. Soit dit en passant, le thème est une application qui enregistre la prédiction de l'équipe à laquelle les joueurs qui ont acquis la FA en 2019 iront. C'est presque décidé, donc ce n'est pas pratique! https://github.com/shimayu22/fa_expects_app/
Dans le tableau FaExpects, le tableau Players est défini comme une clé externe afin que les joueurs enregistrés puissent le sélectionner dans le menu déroulant. Les données des joueurs sont également disponibles, vous pouvez donc les essayer simplement en les lisant. Veuillez consulter README pour savoir comment l'utiliser.
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/
Lorsque vous ouvrez le menu déroulant "Lecteur",
Il sera affiché de manière bâclée comme l'image.Est-il possible de filtrer sur l'écran de gestion?
Depuis ForeignKey.limit_choices_to dans la documentation Django
Définissez une limite sur les choix disponibles dans ce champ lorsque ce champ est rendu à l'aide de ModelForm ou d'admin (par défaut, tous les objets de l'ensemble de requêtes peuvent être sélectionnés). Vous pouvez utiliser un dictionnaire, un objet Q ou un objet appelable qui renvoie un dictionnaire ou un objet Q. (Google Traduction)
Vous pouvez donc utiliser limit_choices_to
pour filtrer les éléments sélectionnables.
https://github.com/shimayu22/fa_expects_app/tree/part2
Ajout de limit_choices_to à player_id de FaExpects.
models.py
player_id = models.ForeignKey(
Players,
on_delete=models.CASCADE,
verbose_name="joueur",
limit_choices_to={"position":1,}
)
Cette fois, seule la position "1" (lanceur) peut être sélectionnée. avec ça, http://127.0.0.1:8000/admin/fa_expects/faexpects/add/ Lorsque vous ouvrez le menu déroulant "Lecteur",
Seuls les joueurs inscrits comme lanceurs étaient affichés!
Dans l'exemple ci-dessus, vous pouvez affiner par égalité telle que position == 1
, mais en utilisant le mot clé de recherche, vous pouvez affiner en utilisant les éléments ci-dessus et suivants.
models.py
player_id = models.ForeignKey(
Players,
on_delete=models.CASCADE,
verbose_name="joueur",
limit_choices_to={"position": 1,
"age__lt": 33}
)
Ce qui précède stipule «position == 1 et âge <33» (lanceur et moins de 33 ans).
Si vous ajoutez __lt
(deux traits de soulignement) au nom de l'élément ʻage`, la condition" moins de "sera ajoutée.
Il y a moins de joueurs à choisir! Les articles suivants sont très bien organisés pour les autres mots-clés.
Référence: [Summary of Django database operations #List of search keywords](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)
Jusqu'à présent, les conditions de recherche étaient spécifiées dans le type de dictionnaire, mais elles peuvent également être spécifiées dans l'objet Q.
models.py
from django.db.models import Q
~~~réduction~~~
player_id = models.ForeignKey(
Players,
on_delete=models.CASCADE,
verbose_name="joueur",
limit_choices_to=Q(position=4) | Q(position=7),
)
Pour les objets Q, vous pouvez spécifier des conditions OR comme celle-ci. Dans ce qui précède, cela signifie "la position est la deuxième base ou le voltigeur".
Je n'ai pu afficher que le joueur de deuxième but ou le voltigeur avec brio!
https://github.com/shimayu22/fa_expects_app/tree/part3
Puisqu'il n'est pas flexible s'il s'agit d'une écriture solide, je vais créer un type de dictionnaire avec une fonction et le transmettre.
Cette fois, afin de le faire rapidement, j'ai fait un tableau pour spécifier les conditions.
J'ajoute la classe RequestedConditions
à Models.py
.
(Parce qu'il est long, veuillez vérifier Models.py)
Ensuite, j'ai créé une fonction pour créer un dictionnaire pour limit_choices_to à partir du dernier enregistrement de la table RequestedConditions
.
Models.py
~~~ abrégé ~~~
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
~~~ abrégé ~~~
Premier, http://127.0.0.1:8000/admin/fa_expects/requestedconditions/add/ Réglez «âge», «position» et «main dominante» et sauvegardez. (Si vous ne définissez pas tout, tout sera affiché)
Après inscription http://127.0.0.1:8000/admin/fa_expects/faexpects/add/ Si vous regardez les joueurs dans, seuls les joueurs qui remplissent les conditions seront affichés.
Je l'ai fait.
Si vous voulez juste faire quelque chose avec le modèle, vous pouvez le faire comme ceci. Il semble que vous puissiez le rendre plus flexible en combinant des objets Q. Jouez avec et essayez-le.
Cela peut être naturel si vous pensez calmement,
limit_choices_to={"age__lt":RequestedConditions.objects.latest('pk').age}
Si vous écrivez quelque chose comme ceci, vous obtiendrez une erreur disant "Il n'y a pas de telle table" lors de la première migration.
Sora (quand j'essaye de me référer à une table qui n'a pas encore été créée) Oui (j'obtiens une erreur) (N'est-ce pas naturel?).
Résumé des opérations de la base de données Django
De plus, les articles suivants ont été utiles pour Django en général. Je vous remercie! [Python] Didacticiel Django - Créer une application Web professionnelle à usage général le plus rapide [Django] Modèle de configuration de champ de modèle