2
votes

Requête Django Sélectionnez X dans la table où Y = Z

Il m'est encore difficile de comprendre clairement la manière dont Django fait des requêtes.

J'ai deux tableaux:

Tableau A:

a_name = 'John'

SELECT code FROM Table_A WHERE name = a_name

Tableau B:

+----+----+
| id |name|
+----+----+
| 96 |John|
+----+----+

La valeur du nom des deux tables peut être égale (ou non). Ce que je dois faire, c'est obtenir la valeur du code de la colonne du tableau A, en comparant le nom des deux tableaux si le tableau B correspond au tableau A dans n'importe quelle ligne. p>

Exemple:

Tableau A:

+----+----+----+
| id |code|name|
+----+----+----+
| 4  | A1 |John|
+----+----+----+

Tableau B:

+----+----+
| id |name|
+----+----+

Donc, en comparant John (B) avec John (A), j'ai besoin que A1 soit renvoyé, car c'est le code donne la même ligne qui correspond à la table A.

En conclusion, j'ai besoin d'un code Django pour faire la requête:

+----+-----+----+
| id |code |name|
+----+-----+----+

compte que je ne connais que la valeur de la table B, donc je ne peux pas obtenir la valeur de code par le name de la table A .


1 commentaires

La question est basique mais très bien détaillée!


4 Réponses :


0
votes
obj = Table_A.objects.get(name = B_name)

print(obj.name)
print(obj.code) # if you want the 'code' field value

6 commentaires

merci @Zollie, je connais déjà ce code. Mais maintenant, comment puis-je obtenir la valeur de la colonne "code" de Table_A? De la même ligne que votre code a bien sûr renvoyé


@ GonzaloD'ambra Comment cette réponse compare-t-elle les deux tableaux? Il vous donne simplement le résultat du code en A.


@Ahtisham - Je pense que son but avec sa question était uniquement de savoir comment obtenir une valeur particulière à partir de tables basées sur une valeur connue. Cela pourrait devenir aussi complexe que n'importe qui le souhaite, mais fondamentalement, la personne qui a posé cette question voulait seulement apprendre à obtenir des valeurs particulières à partir d'une table ... Alors tant pis ...


@Zollie Voici ce qu'il a dit: "Ce que je dois faire est d'obtenir la valeur du code de colonne de la table A, en comparant le nom des deux tables si la table B correspond à la table A dans n'importe quelle ligne."


@Ahtisham - L'affiche voulait très probablement demander `` filtrer et obtenir une valeur d'une autre table en fonction d'une autre valeur '', au lieu de cela, il a écrit `` comparer deux valeurs '' et ainsi de suite, vous voyez ... parfois, ces choses se produisent simplement et peut être mal compris. L'anglais n'est pas la langue maternelle de nombreuses personnes ici.


Il est également vrai que l’affiche n’a pas encore assez de réputation pour voter pour qui que ce soit, alors je vais également voter pour sa question car elle était assez bien détaillée sur sa question.



1
votes

Supposons que TableA et TableB soient des modèles django. Ensuite, votre requête peut ressembler à ceci:

a_name = 'John'

it_matches_on_b = ( Table_B
                   .objects
                   .filter(  name = a_name )
                   .exists()
                  )

fist_a = ( Table_A
            .objects
            .filter(  name = a_name )
            .first()
          )

your_code = fist_a.code if it_matches_on_b and fist_a != None else None

Je ne commente pas le code car il est explicite. Mais écrivez des questions sur les commentaires si vous en avez.


0 commentaires

2
votes

Supposons que le nom de vos tables soit respectivement A et B alors:

try:
    obj = A.objects.get(name='John')
    if B.objects.filter(name='John').exists():
        print obj.code # found a match and now print code.      
except:
    pass 


0 commentaires

1
votes

Une autre approche consiste à utiliser les méthodes values ​​ et values_list de Django. Vous indiquez le nom du champ pour lequel vous voulez des données.

b_names_list = Table_B.objects.values_list('name', flat=True)
values =Table_A.objects.filter(name__in=b_names_list).values_list('code', flat=True)

Ceci renvoie un dictionnaire contenant uniquement les valeurs de code . À partir de la documentation de django, https://docs.djangoproject.com/en/2.1/ref/models/querysets/#django.db.models.query.QuerySet.values ​​

Ou vous pouvez utiliser values_list pour formater le résultat sous forme de liste.

values = Table_A.objects.filter(name=B_name).values_list('code')

Cela renverra une liste de tuples, même si vous ne demandez qu'un seul champ. La documentation django, https : //docs.djangoproject.com/en/2.1/ref/models/querysets/#django.db.models.query.QuerySet.values_list

Pour essayer d'en faire un peu plus robuste, vous obtenez d'abord votre liste de valeurs nommées à partir de Table_B. Fournir flat = True crée une vraie liste, car values_list vous donnera une liste de tuples. Utilisez ensuite la liste pour filtrer sur Table_A. Vous pouvez renvoyer uniquement le code ou le code et le nom. Tel qu'il est écrit, il renvoie une liste plate de codes utilisateur pour chaque nom correspondant dans le tableau A et le tableau B.

values = Table_A.objects.filter(name=B_name).values('code')


8 commentaires

@ GonzaloD'ambra Comment ça marche? L'auteur de cette réponse obtient simplement la valeur du code à partir du tableau A s'il a un nom John mais vous avez dit dans votre question que vous voulez comparer les deux tableaux pour la valeur John et si cela se trouve dans les deux tableaux, vous voulez obtenir le code dans le tableau A.


Les QuerySets sont construits de manière itérative. La documentation de django a une bonne description ici, docs.djangoproject.com/en/ 2.1 / topics / db / queries . La section sur les ensembles de requêtes filtrés uniques a un petit exemple décent. Vous pouvez enchaîner autant de méthodes de génération de filtres / ensembles de requêtes que nécessaire pour atteindre l'objet souhaité.


C'était la meilleure réponse à ce jour. Je pense que ça peut marcher pour moi. Je vous remercie! Maintenant, j'ai juste besoin de savoir comment obtenir les données propres de ce dictionnaire de requêtes, afin d'utiliser la valeur de "code"


@Ahtisham la réponse est juste, il renvoie la valeur de "code"


@ GonzaloD'ambra D'autres réponses renvoient également la valeur de code . Et ils le font comme vous l'avez suggéré dans votre question. Obtenez le code uniquement si deux noms dans chaque table sont identiques.


@Ahtisham J'ai mis à jour la réponse pour répondre plus complètement à la question. Je lui ai fait connaître une méthode django qui fournit les fonctionnalités qu'il recherche. L'édition vous permet de ne pas avoir besoin de connaître les données dans l'une des tables. Il recherche simplement dans les deux tableaux et fournit des codes. Cela répond à sa question et il n'a pas besoin d'effectuer une grande boucle pour obtenir ses informations. C'est juste une requête django construite à partir de plusieurs définitions QuerySet.


@Rachel Quel est l'intérêt d'obtenir une liste de noms? Il demande juste de trouver un seul nom John .


@Ahtisham Quand j'ai supposé qu'il connaissait le nom qu'il cherchait, vous étiez très préoccupé par le fait que la réponse ne correspondait pas à la question. Cette réponse trouvera le code pour tout le monde avec des correspondances dans les tableaux A et B. J'ai supprimé l'hypothèse qu'il connaissait les données qu'il recherchait. Il peut modifier la requête comme il l'entend pour répondre à ses besoins. Cela répond à la question de savoir comment obtenir un champ d'une table lorsque je dois faire correspondre un champ différent.