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 : 341
Taille : 109,6 Ko
Nom : Screenshot 2022-07-25 at 22.08.04.png
Affichages : 323
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