Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2017-03-15T10:20:24+01:00Les derniers messages parus sur le forum de Zeste de Savoir.faire la somme d'un champ par mois, message #1444352017-03-15T10:20:24+01:00vohu/@vohuhttps://zestedesavoir.com/forums/sujet/8209/faire-la-somme-dun-champ-par-mois/?page=1#p144435<p>Salut, je bosse sur un ptit projet django, et je commence à fumer sur certaines requêtes…</p>
<p>J’utilise django 1.10 en python3, et sqlite3.</p>
<p>Avec un modèle comme celui là :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Appel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="n">debut_appel</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">verbose_name</span><span class="o">=</span><span class="s2">"Debut de l'appel"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">now</span><span class="p">,</span> <span class="n">editable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">null</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">fin_appel</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">verbose_name</span><span class="o">=</span><span class="s2">"Fin de l'appel"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">now</span><span class="p">,</span> <span class="n">null</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">duree_appel_calculee</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">BigIntegerField</span><span class="p">(</span><span class="n">verbose_name</span><span class="o">=</span><span class="s2">"Durée de l'appel calculée en secondes"</span><span class="p">,</span> <span class="n">null</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">editable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">personne</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Personne</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s2">"appels"</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="s2">"Personne"</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
<p>duree_appel_calculee est calculé et enregistré à l’enregistrement du formulaire.</p>
<p>J’aimerai donc faire une requête qui me permette d’avoir la somme de duree_appel_calculee par mois pour une personne. Un truc du genre :</p>
<ul>
<li>2016-12 | 143</li>
<li>2017-02 | 61</li>
<li>2017-03 | 59</li>
<li>2017-05 | …</li>
</ul>
<p>Donc jusque maintenant, j’ai filtré par personne, et j’ai un champ calculé ’da’ tronqué sur le mois.</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="n">Appel</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">personne</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="n">da</span><span class="o">=</span><span class="n">TruncMonth</span><span class="p">(</span><span class="s1">'debut_appel'</span><span class="p">))</span><span class="o">.</span><span class="n">values</span><span class="p">(</span><span class="s1">'da'</span><span class="p">,</span> <span class="s1">'duree_appel_calculee'</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
<blockquote>
<p><QuerySet [{’da’: datetime.datetime(2017, 2, 1, 0, 0, tzinfo=<UTC>), ’duree_appel_calculee’: 61}, {’da’: datetime.datetime(2017, 3, 1, 0, 0, tzinfo=<UTC>), ’duree_appel_calculee’: 1}, {’da’: datetime.datetime(2017, 3, 1, 0, 0, tzinfo=<UTC>), ’duree_appel_calculee’: 58}]></p>
</blockquote>
<p>Maintenant, vu que je ne peux utiliser l’agréation sur le champ ’da’ (sqlite ne le gère pas), j’aimerai le convertir en chaine avec DateTime.strftime("%Y-%m") mais… je coince…</p>
<p>Merci d’avance pour votre aide</p>