Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

django et jointure

8 réponses
Avatar
hervest
Bonjour,
je voudrais réaliser une jouinture avec django et la présenter en liste html (forms.ModelChoiceField) mais je n'arrive pas

SELECT date_debut, date_fin, libelle
FROM stage, type_stage
WHERE type_stage.id = stage.id
AND valid=1;""")

Le model étant:

class Stage(models.Model):
id = models.AutoField(primary_key=True)
type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editable=False, default=True)

class Type_stage(models.Model):
id=models.IntegerField(primary_key=True)
code=models.CharField(max_length=10)
libelle=models.CharField(max_length=57)

j'ai essayé de coder en dur mais je n'arrive pas à afficher le "row" dans ma page sous forme de tableau

cursor.execute("""
SELECT date_debut, date_fin, signification
FROM aerien_stage, aerien_type_stage
WHERE aerien_type_stage.typStg_id = aerien_stage.typ_stage_id
AND valid=1;""")
row = cursor.fetchone()

Merci

8 réponses

Avatar
JB
Pourquoi ne pas utiliser l'api strandard de Django ?

rows = models.Stage.objects.filter(valid=1)

apres pour le ModelChoiceField je ne sais pas trop

field = forms.ChoiceField( choices=rows )

Tiens nous au jus






Julien
Avatar
Bruno Desthuilliers
hervest a écrit :
Bonjour,
je voudrais réaliser une jouinture avec django et la présenter en liste html
(forms.ModelChoiceField) mais je n'arrive pas

SELECT date_debut, date_fin, libelle
FROM stage, type_stage
WHERE type_stage.id = stage.id
AND valid=1;""")

Le model étant:

class Stage(models.Model):
id = models.AutoField(primary_key=True)
type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editableúlse, default=True)

class Type_stage(models.Model):
id=models.IntegerField(primary_key=True)
code=models.CharField(max_length)
libelle=models.CharField(max_lengthW)

j'ai essayé de coder en dur mais je n'arrive pas à afficher le "row" dans ma
page sous forme de tableau

cursor.execute("""
SELECT date_debut, date_fin, signification
FROM aerien_stage, aerien_type_stage
WHERE aerien_type_stage.typStg_id = aerien_stage.typ_stage_id
AND valid=1;""")
row = cursor.fetchone()

Merci



Je ne suis pas très sûr d'avoir bien compris ce que tu veux faire. Mais
s'il s'agit d'afficher une liste des stages valides avec date debut,
date fin, et libellé du type de stage:

# views.py
def list_stages(request):
context = {
'stage_list': Stage.object.filter(valid=True).select_related()
}
return render_to_response("list_stage.html", context)

# list_stage.html

<ul>
{% for stage in stage_list %}
<li>
{{ stage.date_debut }} - {{ stage.date_fin }}
- {{ stage.type_stage.libelle }}
</li>
{% endfor %}
</ul>

Si ça ne répond pas à ta question, peut-être qu'en reformulant de façon
plus détaillée ?-)

<hs>
Au fait, tes problèmes d'encodage, c'en est où ?
</hs>
Avatar
hervest
Bruno Desthuilliers a écrit le 06/01/2009 à 11h35 :
hervest a écrit :
Bonjour,
je voudrais réaliser une jouinture avec django et la présenter
en liste html
(forms.ModelChoiceField) mais je n'arrive pas

SELECT date_debut, date_fin, libelle
FROM stage, type_stage
WHERE type_stage.id = stage.id
AND valid=1;""")

Le model étant:

class Stage(models.Model):
id = models.AutoField(primary_key=True)
type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editableúlse, default=True)

class Type_stage(models.Model):
id=models.IntegerField(primary_key=True)
code=models.CharField(max_length)
libelle=models.CharField(max_lengthW)

j'ai essayé de coder en dur mais je n'arrive pas à afficher le
"row" dans ma
page sous forme de tableau

cursor.execute("""
SELECT date_debut, date_fin, signification
FROM aerien_stage, aerien_type_stage
WHERE aerien_type_stage.typStg_id = aerien_stage.typ_stage_id
AND valid=1;""")
row = cursor.fetchone()

Merci




Je ne suis pas très sûr d'avoir bien compris ce que tu veux faire.
Mais
s'il s'agit d'afficher une liste des stages valides avec date debut,
date fin, et libellé du type de stage:

# views.py
def list_stages(request):
context = {
'stage_list': Stage.object.filter(valid=True).select_related()
}
return render_to_response("list_stage.html", context)

# list_stage.html

<ul>
{% for stage in stage_list %}
<li>
{{ stage.date_debut }} - {{ stage.date_fin }}
- {{ stage.type_stage.libelle }}
</li>
{% endfor %}
</ul>

Si ça ne répond pas à ta question, peut-être qu'en
reformulant de façon
plus détaillée ?-)

<hs>
Au fait, tes problèmes d'encodage, c'en est où ?
</hs>


Bonjour Mr Bruno,
Merci énormément, c'est vrai que je me suis mal exprimé mais vous m'avez trouvez ce que je cherchais depuis 24h.

select_related() (il est magnifique)

Si je comprends bien il permet une jointure entre les deux tables.
Je ne sais pas comment vous l'avez trouvé. J'ai fouillé hier la documentation officielle et je n'avais rien trouvé. je viens de le voir dans la section "database API reference". Je pense qu'il faudrait donner des expemples de syntaxte sql avec pour aider les gens débutants venant d'un monde SQL comme moi (si ça n'existe pas encore).Si non j'aimerais bien le faire pour aider les autres mais là il me faudra du temps pour tout maîtriser

Pour mon problème d'encodage, j'ai réussi à le faire tard dans cette nuit. J'ai pu passer mon termale en iso ISO8859-15 cela m'a permis d'avoir des accents dans mon shell puis j'ai changé l'encodage des fichiers python en

# -*- coding: ISO8859-15 -*-

mais jutilise toujours u"libellé" pour que le "é" puisse apparaître sur les pages et dans les pages html j'utilise le codage HTML (&eacute; , &egrave; ...)

encore merci
Avatar
Bruno Desthuilliers
hervest a écrit :
Bruno Desthuilliers a écrit le 06/01/2009 à 11h35 :
hervest a écrit :
Bonjour,
je voudrais réaliser une jouinture avec django et la présenter
en liste html
(forms.ModelChoiceField) mais je n'arrive pas







(snip)

Je ne suis pas très sûr d'avoir bien compris ce que tu veux faire.
Mais
s'il s'agit d'afficher une liste des stages valides avec date debut,
date fin, et libellé du type de stage:

# views.py
def list_stages(request):
context = {
'stage_list': Stage.object.filter(valid=True).select_related()
}
return render_to_response("list_stage.html", context)





(snip)

<hs>
Au fait, tes problèmes d'encodage, c'en est où ?
</hs>




>
Bonjour Mr Bruno,
Merci énormément, c'est vrai que je me suis mal exprimé mais vous m'avez
trouvez ce que je cherchais depuis 24h.

select_related() (il est magnifique)

Si je comprends bien il permet une jointure entre les deux tables.



Oui et non. Le code ci-dessus serait fonctionnellement identique sans le
select_related (un champ de type ForeignKey donne accès directement à
l'objet 'lié'). Simplement, il génèrerait juste beaucoup plus de
requêtes SQL (une par accès à stage.type_stage pour être précis) pour
récupérer les objets TypeStage, alors que le select_related essaie de
gérer au mieux (notamment en générant des requêtes avec jointures).

Accessoirement, si ta classe Stage à d'autre ForeignKey et que tu ne
veux pas _tout_ inclure dans la requête (par défaut, select_related
essaie de suivre toute les clés externes aussi loin que possible, ce qui
n'est pas forcément optimal), tu peux passer en paramètre le nom des
clés à suivre, ie:

Stage.objects.all().selected_related("type_stage")


Je ne sais pas comment vous l'avez trouvé.



J'ai la mauvaise habitude d'éplucher les docs, surtout quand elles sont
de bonne qualité !-)


(snip)

Pour mon problème d'encodage, j'ai réussi à le faire tard dans cette nuit. J'ai
pu passer mon termale en iso ISO8859-15 cela m'a permis d'avoir des accents dans
mon shell puis j'ai changé l'encodage des fichiers python en

# -*- coding: ISO8859-15 -*-



<hs>Est-ce bien l'encodage utilisé pour sauvegarder tes fichiers ?</hs>

mais jutilise toujours u"libellé" pour que le "é" puisse apparaître sur les
pages



right. A ce propos:
http://docs.djangoproject.com/en/dev/ref/unicode/

<hs>
et dans les pages html j'utilise le codage HTML (&eacute; , &egrave; ...)



Si l'encodage est correct et cohérent sur toute ta "chaine" (sources,
database, templates HTML, serveur etc), tu n'en a pas besoin - et il est
même conseillé d'éviter, car ça peut masquer une incohérence dans la
chaine.

Au risque de me répéter, mon expérience est que le meilleur moyen d'être
tranquille avec l'encodage - surtout dans du développement web - est de
passer *l'intégralité* de la chaine en utf-8, de façon systématique.
</hs>

encore merci



De rien.
Avatar
hervest
Bruno Desthuilliers a écrit le 06/01/2009 à 11h35 :
hervest a écrit :
Bonjour,
je voudrais réaliser une jouinture avec django et la présenter
en liste html
(forms.ModelChoiceField) mais je n'arrive pas

SELECT date_debut, date_fin, libelle
FROM stage, type_stage
WHERE type_stage.id = stage.id
AND valid=1;""")

Le model étant:

class Stage(models.Model):
id = models.AutoField(primary_key=True)
type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editableúlse, default=True)

class Type_stage(models.Model):
id=models.IntegerField(primary_key=True)
code=models.CharField(max_length)
libelle=models.CharField(max_lengthW)

j'ai essayé de coder en dur mais je n'arrive pas à afficher le
"row" dans ma
page sous forme de tableau

cursor.execute("""
SELECT date_debut, date_fin, signification
FROM aerien_stage, aerien_type_stage
WHERE aerien_type_stage.typStg_id = aerien_stage.typ_stage_id
AND valid=1;""")
row = cursor.fetchone()

Merci




Je ne suis pas très sûr d'avoir bien compris ce que tu veux faire.
Mais
s'il s'agit d'afficher une liste des stages valides avec date debut,
date fin, et libellé du type de stage:

# views.py
def list_stages(request):
context = {
'stage_list': Stage.object.filter(valid=True).select_related()
}
return render_to_response("list_stage.html", context)

# list_stage.html

<ul>
{% for stage in stage_list %}
<li>
{{ stage.date_debut }} - {{ stage.date_fin }}
- {{ stage.type_stage.libelle }}
</li>
{% endfor %}
</ul>

Si ça ne répond pas à ta question, peut-être qu'en
reformulant de façon
plus détaillée ?-)

<hs>
Au fait, tes problèmes d'encodage, c'en est où ?
</hs>


encore un dernier que j'arrive pas à faire (ManyToMany)

SELECT nom
FROM stagiaire_stage, stagiaire
WHERE stagiaire_stage.id = 1

je m'explique j'ai trois tables: stagiaire, stage, et stagiaire_stage (table générée automatiquement dû au ManyToMany) je veux faire une jointure pour trouver les stagiaires qui on un stage avec le model suivant

class Stage(models.Model):
id = models.AutoField(primary_key=True)
type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editable úlse, default=True)

class Stagiaire(models.Model):
stgr_id=models.AutoField(primary_key=True)
nom_st=models.CharField(max_length%)
stage=models.ManyToManyField(Stage)

comme le model n'a pas de table stagiaire_stage on fait comment?

Merci
Avatar
Bruno Desthuilliers
hervest a écrit :
(snip)
encore un dernier que j'arrive pas à faire (ManyToMany)

SELECT nom
FROM stagiaire_stage, stagiaire
WHERE stagiaire_stage.id = 1

je m'explique j'ai trois tables: stagiaire, stage, et stagiaire_stage (table
générée automatiquement dû au ManyToMany) je veux faire une jointure pour
trouver les stagiaires qui on un stage avec le model suivant

class Stage(models.Model):
id = models.AutoField(primary_key=True)



Cette ligne est inutile - django le fera automatiquement.

type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editableúlse, default=True)

class Stagiaire(models.Model):
stgr_id=models.AutoField(primary_key=True)



idem. Et en pratique, ca simplifie la vie d'appeller l'id 'id'

nom_st=models.CharField(max_length%)



le '_st' est redondant. Enfin, AMHA.

stage=models.ManyToManyField(Stage)



pour un many2many, j'aurais plutôt utiliser un pluriel...

comme le model n'a pas de table stagiaire_stage on fait comment?



Stagiaire.object.filter(stage__id=1)

Ou, si tu a l'instance de Stage sous la main, tu peux utiliser la
relation inverse:

stage.stagiaire_set.all()


Accessoirement, puis-je te suggérer de prendre un peu de temps pour lire
la doc ?-) Tout ça y est très bien expliqué, avec exemples à l'appui...
Avatar
hervest
Bruno Desthuilliers a écrit le 06/01/2009 à 16h05 :
hervest a écrit :
(snip)
encore un dernier que j'arrive pas à faire (ManyToMany)

SELECT nom
FROM stagiaire_stage, stagiaire
WHERE stagiaire_stage.id = 1

je m'explique j'ai trois tables: stagiaire, stage, et stagiaire_stage (table
générée automatiquement dû au ManyToMany) je veux
faire une jointure pour
trouver les stagiaires qui on un stage avec le model suivant

class Stage(models.Model):
id = models.AutoField(primary_key=True)




Cette ligne est inutile - django le fera automatiquement.

type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editableúlse, default=True)

class Stagiaire(models.Model):
stgr_id=models.AutoField(primary_key=True)




idem. Et en pratique, ca simplifie la vie d'appeller l'id 'id'

nom_st=models.CharField(max_length%)




le '_st' est redondant. Enfin, AMHA.

stage=models.ManyToManyField(Stage)




pour un many2many, j'aurais plutôt utiliser un pluriel...

comme le model n'a pas de table stagiaire_stage on fait comment?




Stagiaire.object.filter(stage__id=1)

Ou, si tu a l'instance de Stage sous la main, tu peux utiliser la
relation inverse:

stage.stagiaire_set.all()


Accessoirement, puis-je te suggérer de prendre un peu de temps pour lire
la doc ?-) Tout ça y est très bien expliqué, avec exemples
à l'appui...


ok merci, je l'ai la documentation officielle imprimée avec moi mais ça pas du tout évident.
Pour les problèmes d'encodage je vais encore chercher.
a plus
Avatar
hervest
hervest a écrit le 06/01/2009 à 16h34 :
Bruno Desthuilliers a écrit le 06/01/2009 à 16h05 :
hervest a écrit :
(snip)
encore un dernier que j'arrive pas à faire (ManyToMany)

SELECT nom
FROM stagiaire_stage, stagiaire
WHERE stagiaire_stage.id = 1

je m'explique j'ai trois tables: stagiaire, stage, et stagiaire_stage (table
générée automatiquement dû au ManyToMany) je veux
faire une jointure pour
trouver les stagiaires qui on un stage avec le model suivant

class Stage(models.Model):
id = models.AutoField(primary_key=True)





Cette ligne est inutile - django le fera automatiquement.

type_stage = models.ForeignKey(Type_stage')
date_debut = models.DateField()
date_fin = models.DateField()
valid = models.BooleanField(editableúlse, default=True)

class Stagiaire(models.Model):
stgr_id=models.AutoField(primary_key=True)





idem. Et en pratique, ca simplifie la vie d'appeller l'id 'id'

nom_st=models.CharField(max_length%)





le '_st' est redondant. Enfin, AMHA.

stage=models.ManyToManyField(Stage)





pour un many2many, j'aurais plutôt utiliser un pluriel...

comme le model n'a pas de table stagiaire_stage on fait comment?





Stagiaire.object.filter(stage__id=1)

Ou, si tu a l'instance de Stage sous la main, tu peux utiliser la
relation inverse:

stage.stagiaire_set.all()


Accessoirement, puis-je te suggérer de prendre un peu de temps pour
lire
la doc ?-) Tout ça y est très bien expliqué, avec
exemples
à l'appui...



ok merci, je l'ai la documentation officielle imprimée avec moi mais
ça pas du tout évident.
Pour les problèmes d'encodage je vais encore chercher.
a plus


je retire ce que je viens de dire( c'est pas évident ), je viens de relire le DATABASE API REFERENCE et je pense que c'est maintenant plus clair. Il me fallait juste un coup de pouce

Encore Merci, ça marche....