[PYTHON] [Apprentissage de Django avec la lame du diable] Comment obtenir un ensemble de requêtes pour une référence avant / arrière

Utilisez-vous Django?

Django est familier avec le framework Web de Python. Selon «SimilarTech, qui montre quand et quels outils ont été introduits sur quels sites», Django semble être en hausse, même si sa part est inférieure à Ruby On Rails dans la plupart des pays. image.png

Django VS Ruby On Rails

En passant, le public cible de cet article est pour ceux qui ont utilisé Django dans une certaine mesure et ceux qui comprennent le modèle MTV (ou MVC) dans une certaine mesure. Si vous ne l'avez pas encore touché, commencez par le tutoriel sur le Site officiel.

Références avant et arrière

Tout d'abord, supposons que vous ayez les trois modèles suivants (tueur de démons, classe et respiration).

kimetsu_no_models.py


from django.db import models


class KisatsuMember(models.Model):
    """Modèle d'abattage de démon"""
    id = models.UUIDField()
    #Sexe ex)竈 MON, ma femme, papillon
    last_name = models.CharField(max_length=20)
    #Nom ex)Sumijiro, Zeni, Shinobu
    first_name = models.CharField(max_length=20)
    #classe
    rank = models.ForeignKey(Rank, on_delete=models.PROTECT)
    #Souffle
    breath = models.ForeignKey(Breath, on_delete=models.PROTECT, null=True)
    #Drapeau actif
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = 'kisatsu_member'


class Rank(models.Model):
    """Modèle de classe"""
    id = models.UUIDField()
    #Nom de classe ex)Pilier, 癸
    name = models.CharField(max_length=10)

    class Meta:
        db_table = 'rank'


class Breath(models.Model):
    """Modèle respiratoire"""
    id = models.UUIDField()
    #Nom du souffle ex)Eau, tonnerre, bête
    name = models.CharField(max_length=10)
    #Nombre de types ex) 6, 10, 11
    number_of_types = models.IntegerField()

    class Meta:
        db_table = 'breath'

Exemple de référence séquentielle

Le fait de référencer les valeurs du tableau du parent à l'enfant, par exemple du tueur de démon à la respiration, est appelé «référence directe». Par exemple, si vous voulez obtenir le nombre de noms, prénoms et types de démons massacreurs qui utilisent le souffle de «l'eau» dans l'ordre, ce sera comme suit.

mizu_no_views.py


water_breath_member = KisatsuMember.objects \
    .filter(breath__name="eau") \
    .values("last_name",
            "first_name",
            "breath__number_of_types")
print(water_breath_user)
# <QuerySet [{'last_name': 'Porte', 'first_name': 'Sumijiro', 'breath__number_of_types': 10},
#            {'last_name': 'Cascade d'échelle', 'first_name': 'Sakonji', 'breath__number_of_types': 10},
#            {'last_name': 'Tomioka', 'first_name': 'Yoshiyuki', 'breath__number_of_types': 11}]>

Publier la requête

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 = 'eau'
;

Exemple de référence inversée

Au contraire, la référence de l'enfant au parent et de la classe au démoniaque est appelée "référence inversée". Essayons maintenant une méthode d'acquisition un peu plus compliquée. Si vous voulez obtenir un nom de respiration autre que "eau" d'un démon masseur dont le rang est "pilier" et "actif", ce sera comme suit. La référence inverse est miso en ce qu'elle joint les noms de table sans trait de soulignement.

hashira_no_views.py


active_hashira_breathes = Rank.objects \
    .filter(name="Pilier",
            kisatsumember__is_active=True) \
    .exclude(kisastumember__breath__name="eau") \
    .values("kisastumember__breath__name")
print(active_hashira_breathes)
# <QuerySet [{'kisastumember__breath__name': 'flamme'},
#            {'kisastumember__breath__name': 'amour'},
#            {'kisastumember__breath__name': 'brume'}...]>

Publier la requête

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 = 'Pilier'
AND kisatsu_member.is_active = 1
AND breath.name <> 'eau'
;

Vous devez maîtriser un chemin

Je ne peux écrire qu'en Python, mais je vais continuer à m'y consacrer!

image.png

Recommended Posts

[Apprentissage de Django avec la lame du diable] Comment obtenir un ensemble de requêtes pour une référence avant / arrière
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment démarrer avec Django
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
Le moyen le plus simple de démarrer avec Django
Comment développer une application de panier avec Django
Calculez la solution optimale pour établir un record du monde pour dix types de compétition avec scipy.optimize
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment définir un dossier partagé avec le système d'exploitation hôte dans CentOS7 sur Virtual BOX
Comment créer un sous-menu avec le plug-in [Blender]
Comment obtenir un utilisateur connecté avec les forms.py de Django
Transition vers l'écran de mise à jour avec le Django a tag
Comment définir l'environnement de développement pour chaque projet avec VSCode + extension Python + Miniconda
Comment référencer des fichiers statiques dans un projet Django
Exécutez le programme sans créer d'environnement Python! !! (Comment démarrer avec Google Colaboratory)
Comment obtenir uniquement les données nécessaires du groupe de données structurées à l'aide d'une méthode polyvalente
Comment définir des variables pouvant être utilisées dans toute l'application Django ~ Utile pour les modèles, etc. ~
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Une histoire sur la façon de traiter le problème CORS
Comment entrer dans l'environnement de développement Python avec Vagrant
[Introduction à Python] Comment obtenir des données avec la fonction listdir
Pour ceux d'entre vous qui ne savent pas comment définir un mot de passe avec Jupyter sur Docker
Comment définir un raccourci pour basculer entre pleine largeur et demi-largeur dans IBus
Comment définir la résolution de sortie pour chaque image clé dans Blender
Comment obtenir et définir le nom du serveur NTP par DHCP
Comment obtenir toutes les valeurs possibles dans une expression régulière
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Comment obtenir l'ID de Type2Tag NXP NTAG213 avec nfcpy
Comment obtenir le pilote d'imprimante pour Oki Mac sous Linux
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Comment obtenir le répertoire où se trouve le EXE construit avec Pyinstaller
Comment créer une étiquette (masque) pour la segmentation avec labelme (masque de segmentation sémantique)
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
[Python] Comment obtenir une valeur avec une clé autre que value avec Enum
Comment envoyer une requête à l'API DMM (FANZA) avec python
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Comment obtenir la version Python
Comment démarrer avec Scrapy
Comment démarrer avec Python
Récupérer la chaîne de requête (chaîne de requête) avec Django
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
Réfléchissez à la façon d'écrire un filtre avec les versions Shotgun API-Contact
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
[Python] Explique comment utiliser la fonction range avec un exemple concret
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Comment obtenir la différence de date et d'heure en secondes avec Python
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Pour trouver le nom de la vue avec l'espace de noms à partir de l'URL (path_info) dans Django
Comment réparer la population initiale avec un algorithme génétique utilisant DEAP
[Python] Comment définir la taille de la fenêtre (cliente) dans le navigateur avec Selenium
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
[Environnement de développement] Comment créer un ensemble de données proche de la base de données de production
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Un guide pour faire de l'IoT avec MicroPython facilement jusqu'à la dernière minute
Comment effectuer un traitement arithmétique avec le modèle Django