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
voici un extrait de mon fichier models.py
Mon problème.
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'
J'arrive à afficher dans mon template tous mes Fields qui sont actifs et les stations qui sont associées de cette manière
etc-Fields 1
-- Station 1
-- Station 3
- Fields 2
-- Station 2
-- Station4
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
car Django est capable de le faire lui-même.
Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part {% if station.fields_id_field.id_field == field.id_field %}
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
mais cela me génère une erreur
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)
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‘QuerySet’ object has no attribute ‘stations_set’
Voyez-vous?
Je vous remercie tout plein
Partager