IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

[Débutant] Comment interagir avec deux tables (JOIN)


Sujet :

Django Python

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut [Débutant] Comment interagir avec deux tables (JOIN)
    Bonjour,
    Je suis débutant avec Django et j'ai réussi à installer Django sur mon Mac.
    J'ai suivi des vidéos pour utiliser ma database qui contient 1 millions de mesures et plusieurs table jointent.
    J'ai aussi créé mes views, mon modèle et tout fonctionne.

    Maintenant je fais face à un problème que je n'arrive pas résoudre depuis 5 jours.

    J'ai une tables Fields qui contient mes champs et j'ai une table Stations qui contient mes stations.
    Les stations appartiennent à un terrain. La colonne fields_id_field contient l'id de Fields
    Nom : Screenshot 2022-07-25 at 13.43.46.png
Affichages : 204
Taille : 109,6 Ko
    Nom : Screenshot 2022-07-25 at 22.08.04.png
Affichages : 178
Taille : 168,9 Ko

    voici un extrait de mon fichier models.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    class Fields(models.Model):
        id_field = models.AutoField(primary_key=True)
        countries_country = models.ForeignKey(Countries, models.DO_NOTHING)
        states_id_state = models.ForeignKey('States', models.DO_NOTHING, db_column='states_id_state')
        field_name = models.CharField(max_length=20)
        field_longname = models.CharField(max_length=45, blank=True, null=True)
        field_lat = models.DecimalField(max_digits=8, decimal_places=6, blank=True, null=True)
        field_lng = models.DecimalField(max_digits=8, decimal_places=6, blank=True, null=True)
        field_alt = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        threshold = models.IntegerField(blank=True, null=True)
        city = models.CharField(max_length=45, blank=True, null=True)
        cp = models.CharField(max_length=45, blank=True, null=True)
        field_created = models.DateTimeField()
        field_active = models.BooleanField()
     
        #def __str__(self):
        #    return '[%s] %s' % (self.id_field, self.field_longname)
     
        class Meta:
            managed = False
            db_table = 'fields'
     
     
    class Stations(models.Model):
        id_station = models.AutoField(primary_key=True)
        fields_id_field = models.ForeignKey(Fields, models.DO_NOTHING, db_column='fields_id_field')
        stations_types_id_stations_type = models.IntegerField()
        station_name = models.CharField(max_length=20)
        station_longname = models.CharField(max_length=45, blank=True, null=True)
        station_active = models.BooleanField()
        station_archive = models.BooleanField()
        station_lat = models.FloatField(blank=True, null=True)
        station_lng = models.FloatField(blank=True, null=True)
        station_alt = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        installed = models.DateTimeField()
        station_description = models.TextField(blank=True, null=True)
        ttn_app_id = models.CharField(max_length=20)
        ttn_dev_id = models.CharField(max_length=20)
        ttn_hardware_serial = models.CharField(max_length=20)
        station_created = models.DateTimeField()
        station_order = models.IntegerField()
        map = models.BooleanField()
     
        class Meta:
            managed = False
            db_table = 'stations'
    Mon problème.

    J'arrive à afficher dans mon template tous mes Fields qui sont actifs et les stations qui sont associées de cette manière
    -Fields 1
    -- Station 1
    -- Station 3
    - Fields 2
    -- Station 2
    -- Station4
    etc
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #views
    def index(request):
        """Return the active fields."""
        fields_list = Fields.objects.filter(field_active=1)
        stations_list = Stations.objects.filter(station_active=1)
     
        #if idstation.isNotNull():
        #    print(idstation)
     
        return render(request, 'map/slider.html', {'fields_list': fields_list, 'stations_list': stations_list})

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <div>
     
        {% if fields_list %}
            <h4>Terrains</h4>
            <ul>
                {% for field in fields_list %}
                <li>
                    ({{ field.id_field}}){{ field.field_name}}
                    <ul>
                        {% for station in stations_list %}
                            {% if station.fields_id_field.id_field == field.id_field %}
                                <li>
                                    <a href="{% url 'map:sensors' station.id_station %}">{{ station.id_station }} ({{ station.station_longname }} ({{ station.fields_id_field.id_field }})</a>
                                </li>
                            {% endif %}
                        {% endfor %}
                    </ul>
                </li>
                {% endfor %}
            </ul>
        {% else %}
            <p>No fields are available.</p>
        {% endif %}
    </div>

    Mais on me dit que je n'ai pas besoin de faire ceci
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    {% if station.fields_id_field.id_field == field.id_field %}
    car Django est capable de le faire lui-même.

    Alors j'essaye de le faire autrement, et je n'y arrive absolument, pas j'aimerais que vous m'aidiez.
    On m'a dit que ceci était une piste

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fields_list = Fields.objects.filter(field_active=1)
    fields_list.stations_set.all() # Il faudrait qu'il filtre que les stations actives (station_active=1)
    mais cela me génère une erreur
    ‘QuerySet’ object has no attribute ‘stations_set’
    J'aimerais donc savoir qu'elle est la syntaxe correcte pour pouvoir, dans mon template, faire un for sur ma variable et afficher mes terrains et stations en fonction de l'objet fields_list. En PHP je faisait un JOIN, mais apparememnt Django gère ceci, mais hélas, je n'arrive pas trouver la bonne syntaxe

    Voyez-vous?
    Je vous remercie tout plein
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par pierrot10 Voir le message
    Voyez-vous?
    Essayez-vous de récupérer les Stations dont les fields associés sont actifs?
    Si c'est le cas, un inner join peut se faire avec select_related.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Bonjour merci

    Je ne sais pas encore ce que donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fields_list = Stations.objects.select_related('fields_id_field').filter(station_active=1)
    print(fields_list)
    Print m'affiche

    <QuerySet [<Stations: Stations object (22)>, <Stations: Stations object (20)>, <Stations: Stations object (21)>, <Stations: Stations object (25)>, <Stations: Stations object (26)>, <Stations: Stations object (32)>, <Stations: Stations object (33)>, <Stations: Stations object (34)>, <Stations: Stations object (35)>, <Stations: Stations object (36)>, <Stations: Stations object (37)>, <Stations: Stations object (38)>, <Stations: Stations object (40)>, <Stations: Stations object (42)>, <Stations: Stations object (27)>, <Stations: Stations object (28)>, <Stations: Stations object (29)>]>
    Est-ce qu'il y a la possiblité de debuger ceci en affichant les membres de l'objet?

    Avec JavaScript, on peut le faire avec console.log() et avec PHP, on le fait avec print_r()
    Comment puis-je vérifier ceci avec Python?

    Merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    [Important] je viens de me rendre compte que je me suis trompé d'image dans #1, je l'ai corrigée et la deuxième image reflète la réalisté

    Ceci etant dit, je ne suis pas sûre que cela me retournera le résultat voulu.

    Si je fais cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fields_list = Fields.objects.select_related('Stations__fields_id_field').filter(field_active=1)
    j'ai ce message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invalid field name(s) given in select_related: 'Stations'. Choices are: countries_country, states_id_state
    et ces deux choix, sont des liaisons sur des tables, que ne me concerne pas encore. (plus tard)

    Ce que je souhaite c'est lister toutes les stations qui sont liées à un champs (field)

    Si je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fields_list = Stations.objects.select_related('fields_id_field').filter(station_active=1)
    je n'ai pas de message d'erreur, mais mon template m'affiche ceci
    * (22)st-22 [printaniere]
    * (20)st-20 [hutins]
    * (21)st-21 [hutins]
    * (25)st-25 [boigies]
    * (26)st-26 [boigies]
    * (32)st-32 [boigies]
    * (33)st-33 [boigies]
    * (34)st-34 [boigies]
    * (35)st-35 [boigies]
    * (36)st-36 [boigies]
    * (37)st-37 [boigies]
    * (38)st-38 [boigies]
    * (40)st-40 [boigies]
    * (42)st-42 [boigies]
    * (27)st-27 [Perrières]
    * (28)st-28 [Perrières]
    * (29)st-29 [Perrières]
    (id station) station name [field

    alors que je souhaite
    * [Perriere]
    * * (27)st-27
    * * (28)st-28
    * * (29)st-29
    * [hutins]
    * * (20)st-20
    * * (21)st-21
    * [boigies]
    * * (34)st-34
    * * (35)st-35
    * * (36)st-36
    * * (37)st-37
    ** etc
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Ce que je souhaite c'est lister toutes les stations qui sont liées à un champs (field)
    Une requête SQL retourne des "lignes".
    Après si vous voulez les regrouper en fonction de... il va falloir créer une structure un peu moins plate comme par exemple un dictionnaire ou une liste de listes.... à décider en fonction de la répartition du boulot à faire entre le traitement de la requête côté Python et du template.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Bonjour merci

    Je ne sais pas encore ce que donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fields_list = Stations.objects.select_related('fields_id_field').filter(station_active=1)
    print(fields_list)
    Print m'affiche



    Est-ce qu'il y a la possiblité de debuger ceci en affichant les membres de l'objet?

    Avec JavaScript, on peut le faire avec console.log() et avec PHP, on le fait avec print_r()
    Comment puis-je vérifier ceci avec Python?

    Merci
    je suis toujours bloqué avec ceci et j'ai vraiment besoin de savoir les valeurs des propriétés d'un objet.
    Comment je peux débuger fields_list? ca m'aiderait vraiment.
    merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    je suis toujours bloqué avec ceci et j'ai vraiment besoin de savoir les valeurs des propriétés d'un objet.
    C'est un pré-requis pour utiliser Django... Si vous êtes préssé, utilisez un langage que vous connaissez... sinon ouvrez un tuto et prenez le temps d'apprendre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Pour ceux qui serait débutant comme et qui cherche connaître ce que retorune un queryset, j'ai trouvé une solution qui m'aide et me convient

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from django.http import HttpResponseRedirect, HttpResponse
    from django.core import serializers
     
    def station(request, idstation, idfield):
        sensors = Sensors.objects.filter(stations_id_station=idstation, sensor_active=1)
     
        sensors_json = serializers.serialize('json', sensors)
        print(sensors_json)
        return HttpResponse(sensors_json, content_type='application/json')

    Il y a surement mieux, mais avec ceci, mon navigateur m'affiche le format json de ma queryset et je peux lire les propriétés. Exemple
    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"model": "map.sensors", "pk": 34, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 2, "sensor_name": "te", "sensor_longname": "Temp. Air", "sensor_description": "Température de l'air ambiante", "sensor_active": 1, "sensor_created": "2021-01-29T02:15:00Z", "chart_style_id_chart_style": 1, "chart_pointstyle_id_chart_pointstyle": 1, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 6, "chart_bordercolor_id_chart_bordercolor": 6}}, {"model": "map.sensors", "pk": 35, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 3, "sensor_name": "pr", "sensor_longname": "Pression", "sensor_description": "Pression atmosphérique", "sensor_active": 1, "sensor_created": "2021-01-29T02:17:48Z", "chart_style_id_chart_style": 1, "chart_pointstyle_id_chart_pointstyle": 1, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 3, "chart_bordercolor_id_chart_bordercolor": 2}}, {"model": "map.sensors", "pk": 36, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 4, "sensor_name": "hu", "sensor_longname": "Humidité", "sensor_description": "Humidité de l'air", "sensor_active": 1, "sensor_created": "2021-01-29T02:18:21Z", "chart_style_id_chart_style": 1, "chart_pointstyle_id_chart_pointstyle": 1, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 4, "chart_bordercolor_id_chart_bordercolor": 4}}, {"model": "map.sensors", "pk": 37, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 5, "sensor_name": "ba", "sensor_longname": "Batterie", "sensor_description": null, "sensor_active": 1, "sensor_created": "2021-01-29T02:22:39Z", "chart_style_id_chart_style": 1, "chart_pointstyle_id_chart_pointstyle": 1, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 1, "chart_bordercolor_id_chart_bordercolor": 1}}, {"model": "map.sensors", "pk": 38, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 8, "sensor_name": "su", "sensor_longname": "Radiation solaire", "sensor_description": null, "sensor_active": 1, "sensor_created": "2021-01-29T02:23:34Z", "chart_style_id_chart_style": 1, "chart_pointstyle_id_chart_pointstyle": 1, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 3, "chart_bordercolor_id_chart_bordercolor": 3}}, {"model": "map.sensors", "pk": 39, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 7, "sensor_name": "wd", "sensor_longname": "Direction du vent", "sensor_description": null, "sensor_active": 1, "sensor_created": "2021-01-29T02:24:27Z", "chart_style_id_chart_style": 4, "chart_pointstyle_id_chart_pointstyle": 4, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 3, "chart_bordercolor_id_chart_bordercolor": 2}}, {"model": "map.sensors", "pk": 40, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 6, "sensor_name": "an", "sensor_longname": "Vitesse du vent", "sensor_description": null, "sensor_active": 1, "sensor_created": "2021-01-29T02:26:32Z", "chart_style_id_chart_style": 1, "chart_pointstyle_id_chart_pointstyle": 1, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 5, "chart_bordercolor_id_chart_bordercolor": 5}}, {"model": "map.sensors", "pk": 49, "fields": {"stations_id_station": 22, "sensor_types_id_sensor_type": 9, "sensor_name": "ga", "sensor_longname": "Gauge", "sensor_description": null, "sensor_active": 1, "sensor_created": "2021-10-18T16:13:31Z", "chart_style_id_chart_style": 2, "chart_pointstyle_id_chart_pointstyle": 1, "chart_borderwidth": 1, "chart_fill": 0, "chart_showline": 1, "chart_pointradius": 1, "chart_pointhoverradius": 13, "chart_backgroundcolor_id_chart_backgroundcolor": 5, "chart_bordercolor_id_chart_bordercolor": 5}}]
    (Firefox m'affiche correctement mon json, ce qui rend la lecture plus simple)
    Nom : Screenshot 2022-07-30 at 23.15.47.png
Affichages : 142
Taille : 151,9 Ko

    Je peux ainsi lire ce que me retourne ma queryset
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

Discussions similaires

  1. affichage d'une valeur en relation avec deux tables
    Par mealtone dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 04/08/2006, 13h52
  2. [Débutant] Formulaire/Requetes relier deux tables
    Par antoine0207 dans le forum Access
    Réponses: 9
    Dernier message: 29/06/2006, 16h07
  3. Faire une procédure stockée avec deux tables
    Par mister3957 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2006, 13h54
  4. Réponses: 8
    Dernier message: 13/03/2006, 17h37
  5. Réponses: 7
    Dernier message: 27/09/2005, 10h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo