django - bonnes pratiques

a marqué ce sujet comme résolu.

Bonjour à tous.

Je suis développeur de métier, je bosse sur du php essentiellement. J’ai envie d’apprendre le python et du coup je me suis lancé dans un petit projet perso avec django. Rien de bien compliqué et j’arrive à faire un truc qui fonctionne mais j’aimerai votre avis sur les "bonnes pratique" à adopter.

J’ai l’habitude en php d’utiliser la fonction print_r() pour afficher à l’écran le contenu d’un tableau, d’un objet etc. Comment je fais ça avec django si je veux afficher le contenu d’un dictionnaire par exemple avant de la passer à une vue?

Seconde question. J’ai 3 classes liés entre elle par des clés étrangères :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Festival(models.Model):
    dateDebut = models.DateTimeField()
    dateFin = models.DateTimeField()

class Evenement(models.Model):
    jour = models.DateTimeField()
    festival = models.ForeignKey(Plan, on_delete=models.CASCADE)

class Activite(models.Model):
    duree = models.DurationField()
    Evenement = models.ForeignKey(Entrainement, on_delete=models.CASCADE)

`

(J’ai enlevé tous les attributs de mes modèles, ils ne sont pas important pour ma question.) Un festival contient plusieurs jour d’événement et pour chaque événement on a plusieurs activité. Je veux afficher toutes les infos d’un festival donnée. J’y arrive mais ça ne me semble pas optimale.

Pour cela je récupère le festival en faisant un get avec l’id que je veux. Puis je récupère tous les événements lié à ce festival en utilisant un filter. (Evenement.objects.filter()) Et pour chaque événement je fais une requête avec un filter pour récupérer les activités. Il y a sûrement qque chose que j’ai pas identifié dans les possibilités de django pour faire ça de façon plus simple non? Ca me semble fou de faire autant de requête alors que l’on devrait pouvoir tout récupérer en une seule. Non? J’ai bien identifié le select_related mais je ne vois pas comment l’utilisé ici puisque mon filtre se fait sur le festival et non sur l’activité.

Merci d’avance

Bonne journée

Salut,

J’ai l’habitude en php d’utiliser la fonction print_r() pour afficher à l’écran le contenu d’un tableau, d’un objet etc. Comment je fais ça avec django si je veux afficher le contenu d’un dictionnaire par exemple avant de la passer à une vue?

Heu… print ? Tu peux aussi utiliser pprint si tu veux que ce soit un peu formaté. Ça s’affichera normalement dans la console du serveur de dev.

J’ai bien identifié le select_related mais je ne vois pas comment l’utilisé ici puisque mon filtre se fait sur le festival et non sur l’activité.

Tu peux faire la query dans l’autre sens :

1
ativities = Activite.objects.filter(evenement__festival__id=Id_du_festival).selecte_related("evenement", "evenement__festival")

Tu va récupérer toutes les activités et les événements et le festival seront fetché dans la même requete (et donc n’entraîneront pas de requêtes supplémentaires quand tu y accédera).

Au passage :

  • Ne met pas de majuscule au nom des attributs (ici Evenement dans Activite) car tu va avoir un conflit avec le nom de la class du même nom.
  • Tu fais référence à une class Entrainement non définit, c’est normal ?

Heu… print ? Tu peux aussi utiliser pprint si tu veux que ce soit un peu formaté. Ça s’affichera normalement dans la console du serveur de dev.

Bah voila, je regardais pas au bon endroit :p Merci!

Tu va récupérer toutes les activités et les événements et le festival seront fetché dans la même requete (et donc n’entraîneront pas de requêtes supplémentaires quand tu y accédera).

Super merci! J’essaie ça dès ce soir! J’avais pas compris qu’on pouvait mettre plusieurs chose dans le selected_related. Ca me parait bcp plus cohérent de faire comme ça.

Tu fais référence à une class Entrainement non définit, c’est normal ?

Oui dsl pour les valeurs dans les ForeignKey. En fait j’ai repris un autre code pour illustrer mon propos (je suis pas sur le poste ou je dev en python) et j’ai oublié des changements visiblement. Dsl.

En tout cas je trouve ça super accessible comme langage et le framework est plutôt sympas aussi. Je comprend mieux pourquoi bcp de personnes conseillent de commencer la prog avec le python.

Merci.

Bonjour,

c’est bon j’ai réussi hier soir à avoir une seule requête pour avoir des données mais du coup je bloque pour les affichés ^^. J’essaie d’afficher un dictionnaire à 2 dimensions et ça ne fonctionne pas. Il se peut, au vu du peu d’info trouver sur le sujet sur stackoverflow et sur google, que ma manière de faire ne soit pas la bonne j’en ai conscience ;) C’est pas si simple de passer du php au python en fait :p

dans mon view.pu j’ai ca :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
for exo in listeevenement:
        festivalTmp=exo.evenement.festival
        evenement[exo.evenement.id]=exo.evenement
        listeactivite[exo.evenement.id][exo.ordre]=exo

    print ("****************÷\r\n")
    print ( listeactivite[1][1] )
    error = ""
    context = {'festival': festivalTmp,
               'evenements': evenement,
               'listeactivite': listeactivite,
               'error_message':error}

    return render(request, 'festival/show.html', context)

dans show.html  :

 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
<h1>festival du {{ festival.dateDebut }} au {{ festival.dateFin }}</h1>

<ul>
  {% for key,evenementTmp in evenements.items %}
    <li>
      <ul>
        <li>id : {{ evenementTmp.id }}</li>
        <li>Jour : {{ evenementTmp.jour }}</li>
        <li>coordX : {{ evenementTmp.coordX }}</li>
        <li>coordY : {{ evenementTmp.coordY }}</li>
        <li>lieu : {{ evenementTmp.lieu }}</li>
        <li>activites :
          <ul>
            {% for k,act in listeactivite.items %}
              test {{ listeactivite }}

            {%endfor%}
          </ul>
        <li>
      </ul>
    </li>
  {%endfor%}
</ul>

`

Ca fonctionne pour l’affichage des infos du festival et des événements par contre je n’arrive a rien afficher pour listeactivite. Vous avez une idée? Ma façon de procéder n’est pas la bonne? J’ai l’impression de pas retrouver mes petits et de revenir dans la peau du gars qui apprends a développer c’est assez déroutant lol

Merci.

Hello,

merci pour ton retour. J’ai essayé ca. J’ai aussi essayé la double boucle for et ça ne marche pas.

J’ai l’impression que mon problème viens du fait que listeactivite est un defaultdict (dsl j’ai oublié de mettre la ligne ou j’initialise cette variable, du coup effectivement il vous manquait l’info). C’est pas ca qu’il faut utiliser pour faire un dictionnaire a 2 dimensions? Peut être que je devrais essayer avec un dictionnaire classique et a chaque fois que je veux insérer un élément tester si il existe et ajouter ou modifier en fonction du résultat.

Dsl j’ai pas pu revenir plus tot sur mon code. Je viens de passer 2 heures sur le sujet mais j’ai avancé :p

Alors pour ceux qui passerait par la plus tard il faut ajouter ca : listeactivite.default_factory = None avant de le passer dans le context. Sinon qd on fait le listeactivite.items sur un defaultdict ca renvoie une liste vide et on va pas plus loin :D

J’ai tjs un soucis d’optimisation, comme j’ai un dictionnaire à 2 dimensions je voudrais faire listeactivite[key] comme tu disais mais ca ca ne marche pas. J’ai systématiquement une erreur : "Could not parse the remainder: ’[1]’" D’après ce que je vois ici : http://stackoverflow.com/questions/4651172/reference-list-item-by-index-within-django-template il faut que je customise le template tag. J’essaierai ça demain.

J’avais oublié à quel point c’était galère d’apprendre un nouveau langage ^^

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte