{"id":1023,"date":"2010-10-30T15:00:00","date_gmt":"2010-10-30T13:00:00","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=1023"},"modified":"2010-10-30T15:00:00","modified_gmt":"2010-10-30T13:00:00","slug":"django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/","title":{"rendered":"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats."},"content":{"rendered":"<p>Ce mois-ci, j&#8217;aurais pu \u00e9crire plusieurs django-app du mois. Si j&#8217;avais eu le temps. Mais bon, le jour o\u00f9 j&#8217;aurais le temps, \u00e7a se saura. Du coup, alors que l&#8217;horloge tourne et qu&#8217;il ne me reste plus qu&#8217;un jour et demi pour \u00e9crire ma django app du mois et mon polargeek, j&#8217;ai d\u00e9cid\u00e9 d&#8217;\u00e9crire ma django-app du mois pour parler de <a href=\"http:\/\/github.com\/mcroydon\/django-qsstats\">django-qsstats<\/a>, une petite application comme je les aime.<\/p>\n<p>C&#8217;est \u00e0 dire, qui ne fait qu&#8217;une chose, une toute petite chose, mais qui la fait bien. Et qui du coup est facilement int\u00e9grable, sans remord.<\/p>\n<h1>1- O\u00f9 on le trouve, comment on l\u2019installe, tout \u00e7a quoi (et la doc)\u00a0?<\/h1>\n<p>On la trouve sur sa page <a href=\"http:\/\/github.com\/mcroydon\/django-qsstats\">github<\/a>. Il me semble bien que le seul moyen d&#8217;installation soit \u00e0 travers github. Mais bon, cloner un repository git hub, ce n&#8217;est pas le plus compliqu\u00e9.<\/p>\n<p>La doc, elle, se limite au fichier <a href=\"http:\/\/github.com\/mcroydon\/django-qsstats\/blob\/master\/README.rst\">Readme<\/a> et \u00e0 la lecture des tests. Mais bon, honn\u00eatement, cela suffit.<\/p>\n<p>Par contre attention, en plus de n\u00e9cessiter django 1.1 \u00e0 minimal, cette petite app a besoin de <a href=\"http:\/\/labix.org\/python-dateutil\">python-dateutil<\/a> (une petite librairie qui ajoute pas mal d&#8217;extension plut\u00f4t puissante \u00e0 datetime, si vous ne connaissez pas, je vous recommande vivement d&#8217;aller jeter un oeil (mais pas les deux, apr\u00e8s vous ne pourrez plus lire la doc \u2026 ) )<\/p>\n<h2>2- Mais au fait, \u00e0 quoi \u00e7a sert\u00a0?<\/h2>\n<p>A presque rien, mais c&#8217;est bien utile.:) Lorsqu&#8217;on veut faire un minimum de stats, de comparaison ou autre, on se retrouve assez vite \u00e0 vouloir trouver combien il y a eu de nouveaux articles la semaine derni\u00e8re, combien d&#8217;histoires ont \u00e9t\u00e9 \u00e9crites par des r\u00f4listes durant le mois dernier, ou d&#8217;utilisateur enregistr\u00e9 les 6 derniers mois&#8230;<\/p>\n<p>Faire cela est tr\u00e8s simple, un petit queryset puis des petits filters. C&#8217;est tr\u00e8s simple, mais bon, c&#8217;est rapidement chiant, et puis c&#8217;est pas tr\u00e8s DRY.<\/p>\n<p>Donc on se retrouve assez vite \u00e0 faire des petits fonctions pour avoir les dates du mois en cours, ou d&#8217;un mois pr\u00e9cis..<\/p>\n<p>O\u00f9 alors on se dit que quelqu&#8217;un \u00e0 surement du le faire \u00e0 notre place, on cherche un peu et on tombe sur django-qsstats.<\/p>\n<h1>3- Comment \u00e7a marche\u00a0?<\/h1>\n<p>C&#8217;est vraiment tout simple. Il suffit de mettre l&#8217;app dans son python-path. Ensuite un peu l&#8217;utiliser. Rien \u00e0 faire de plus. M\u00eame pas de syncb vu que c&#8217;est une app sans model. (il y a un fichier models mais il n&#8217;est l\u00e0 que pour les tests).<br \/>\nEnsuite, ben un exemple sera plus parlant (je reprend l&#8217;exemple du site officiel) \u00a0:<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"kw1\">from<\/span> django.<span class=\"me1\">contrib<\/span>.<span class=\"me1\">auth<\/span> <span class=\"kw1\">import<\/span> User<br \/>\n<span class=\"kw1\">import<\/span> qsstats<br \/>\n<br \/>\nqs <span class=\"sy0\">=<\/span> User.<span class=\"me1\">objects<\/span>.<span class=\"kw2\">all<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nqss <span class=\"sy0\">=<\/span> qsstats.<span class=\"me1\">QuerySetStats<\/span><span class=\"br0\">&#40;<\/span>qs<span class=\"sy0\">,<\/span> <span class=\"st0\">'date_joined'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">print<\/span> <span class=\"st0\">'%s new accounts today.'<\/span> % qss.<span class=\"me1\">this_day<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw1\">print<\/span> <span class=\"st0\">'%s new accounts this month.'<\/span> % qss.<span class=\"me1\">this_month<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw1\">print<\/span> <span class=\"st0\">'%s new accounts this year.'<\/span> % qss.<span class=\"me1\">this_year<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw1\">print<\/span> <span class=\"st0\">'%s new accounts until now.'<\/span> % qss.<span class=\"me1\">until_now<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/div>\n<p>Vous le voyez, c&#8217;est assez facile. On construit son queryset et ensuite on le passe \u00e0 qsstats en lui indiquant le champ date qui devra servir au filtrage.<\/p>\n<p>D\u00e9j\u00e0 l\u00e0, \u00e7a serait pas mal. Mais il y a mieux. Il existe la fonction time_series qui permet de r\u00e9cup\u00e9rer une liste de valeur. Par exemple\u00a0:<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"kw1\">from<\/span> django.<span class=\"me1\">contrib<\/span>.<span class=\"me1\">auth<\/span> <span class=\"kw1\">import<\/span> User<br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">datetime<\/span><span class=\"sy0\">,<\/span> qsstats<br \/>\n<br \/>\nqs <span class=\"sy0\">=<\/span> User.<span class=\"me1\">objects<\/span>.<span class=\"kw2\">all<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nqss <span class=\"sy0\">=<\/span> qsstats.<span class=\"me1\">QuerySetStats<\/span><span class=\"br0\">&#40;<\/span>qs<span class=\"sy0\">,<\/span> <span class=\"st0\">'date_joined'<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\ntoday <span class=\"sy0\">=<\/span> <span class=\"kw3\">datetime<\/span>.<span class=\"me1\">date<\/span>.<span class=\"me1\">today<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\nseven_days_ago <span class=\"sy0\">=<\/span> today - <span class=\"kw3\">datetime<\/span>.<span class=\"me1\">timedelta<\/span><span class=\"br0\">&#40;<\/span>days<span class=\"sy0\">=<\/span><span class=\"nu0\">7<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\ntime_series <span class=\"sy0\">=<\/span> qss.<span class=\"me1\">time_series<\/span><span class=\"br0\">&#40;<\/span>seven_days_ago<span class=\"sy0\">,<\/span> today<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw1\">print<\/span> <span class=\"st0\">'New users in the last 7 days: %s'<\/span> % <span class=\"br0\">&#91;<\/span>t<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">for<\/span> t <span class=\"kw1\">in<\/span> time_series<span class=\"br0\">&#93;<\/span><\/div><\/div>\n<p>qui donnera\u00a0:<br \/>\nNew users in the last 7 days: [3, 10, 7, 4, 12, 9, 11]<\/p>\n<p>Si cela it\u00e8re par jour, ce n&#8217;est pas magique, c&#8217;est parce jour (enfin day) est l&#8217;argument step par d\u00e9faut. Mais on peu bien entendu changer la taille du pas.<\/p>\n<p>Enfin, par d\u00e9faut, toutes les fonctions utilise Count pour calculer les r\u00e9sultat. (et quand je dis Count, c&#8217;est effectivement la class Count des Aggregat de django) Mais on peut changer ce comportement en donnant une valeur au param\u00e8tre agregate_class du QuerySetStats.<\/p>\n<h1>4-Conclusion<\/h1>\n<p>Comme je le disais en introduction, j&#8217;aime beaucoup les petites apps qui font des petits trucs, mais qui le font bien. C&#8217;est bien souvent plus utile que les grosses apps qui font tout et le caf\u00e9 et qui sont bien plus difficile \u00e0 int\u00e9grer (ceci n&#8217;est pas une critique de pinax hein, ne me faite pas dire ce que je n&#8217;ai pas dit).<\/p>\n<p>Donc j&#8217;aime forc\u00e9ment, beaucoup qsstats.<\/p>\n<p>Une petite information un fork de qsstats a \u00e9t\u00e9 cr\u00e9\u00e9, sur bitbucket (et que vous trouverez sur pypi). Il s&#8217;appelle <a href=\"http:\/\/bitbucket.org\/kmike\/django-qsstats-magic\/src\">django-qsstats-magic<\/a>. Il rajoute la gestion des heures et des minutes, une optimisation qui fonctionne avec mysql et modifie des trucs en interne. Mais effectivement, je n&#8217;ai pas pouss\u00e9 plus loin mes investigations.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce mois-ci, j&#8217;aurais pu \u00e9crire plusieurs django-app du mois. Si j&#8217;avais eu le temps. Mais bon, le jour o\u00f9 j&#8217;aurais le temps, \u00e7a se saura. Du coup, alors que l&#8217;horloge tourne et qu&#8217;il ne me reste plus qu&#8217;un jour et demi pour \u00e9crire ma django app du mois et mon polargeek, j&#8217;ai d\u00e9cid\u00e9 d&#8217;\u00e9crire ma &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats.<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[35],"tags":[99,98],"class_list":["post-1023","post","type-post","status-publish","format-standard","hentry","category-la-django-app-du-mois","tag-django","tag-python"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu&#039;on veut filtrer sur des crit\u00e8res temporels.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"J-Mad\"\/>\n\t<meta name=\"keywords\" content=\"django,python,la django-app du mois\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Le Mad Blog | juste un blog\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Django-qsstats, parce qu&#039;en vrai,on adore tous faire des stats. | Le Mad Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu&#039;on veut filtrer sur des crit\u00e8res temporels.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2010-10-30T13:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2010-10-30T13:00:00+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Django-qsstats, parce qu&#039;en vrai,on adore tous faire des stats. | Le Mad Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu&#039;on veut filtrer sur des crit\u00e8res temporels.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#article\",\"name\":\"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | Le Mad Blog\",\"headline\":\"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats.\",\"author\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/author\\\/j-mad\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/#organization\"},\"datePublished\":\"2010-10-30T15:00:00+02:00\",\"dateModified\":\"2010-10-30T15:00:00+02:00\",\"inLanguage\":\"fr-fr\",\"commentCount\":1,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#webpage\"},\"articleSection\":\"La Django-app du mois, Django, Python\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/j-mad.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/#listItem\",\"name\":\"D\\u00e9veloppement\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/#listItem\",\"position\":2,\"name\":\"D\\u00e9veloppement\",\"item\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/#listItem\",\"name\":\"Python\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/#listItem\",\"position\":3,\"name\":\"Python\",\"item\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/#listItem\",\"name\":\"Django\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/#listItem\",\"name\":\"D\\u00e9veloppement\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/#listItem\",\"position\":4,\"name\":\"Django\",\"item\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/la-django-app-du-mois\\\/#listItem\",\"name\":\"La Django-app du mois\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/#listItem\",\"name\":\"Python\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/la-django-app-du-mois\\\/#listItem\",\"position\":5,\"name\":\"La Django-app du mois\",\"item\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/la-django-app-du-mois\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#listItem\",\"name\":\"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats.\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/#listItem\",\"name\":\"Django\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#listItem\",\"position\":6,\"name\":\"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats.\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/category\\\/developpement\\\/python\\\/django\\\/la-django-app-du-mois\\\/#listItem\",\"name\":\"La Django-app du mois\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/#organization\",\"name\":\"Le Mad Blog\",\"description\":\"juste un blog\",\"url\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/author\\\/j-mad\\\/#author\",\"url\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/author\\\/j-mad\\\/\",\"name\":\"J-Mad\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6eb44e8eb2792583de23c66deb033f8b5ef4f7f7c535464d77cb9f643012d138?s=96&d=retro&r=g\",\"width\":96,\"height\":96,\"caption\":\"J-Mad\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#webpage\",\"url\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/\",\"name\":\"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | Le Mad Blog\",\"description\":\"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu'on veut filtrer sur des crit\\u00e8res temporels.\",\"inLanguage\":\"fr-fr\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/2010\\\/10\\\/30\\\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/author\\\/j-mad\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/author\\\/j-mad\\\/#author\"},\"datePublished\":\"2010-10-30T15:00:00+02:00\",\"dateModified\":\"2010-10-30T15:00:00+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/\",\"name\":\"Le Mad Blog\",\"description\":\"juste un blog\",\"inLanguage\":\"fr-fr\",\"publisher\":{\"@id\":\"https:\\\/\\\/j-mad.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | Le Mad Blog","description":"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu'on veut filtrer sur des crit\u00e8res temporels.","canonical_url":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/","robots":"max-image-preview:large","keywords":"django,python,la django-app du mois","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#article","name":"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | Le Mad Blog","headline":"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats.","author":{"@id":"https:\/\/j-mad.com\/blog\/author\/j-mad\/#author"},"publisher":{"@id":"https:\/\/j-mad.com\/blog\/#organization"},"datePublished":"2010-10-30T15:00:00+02:00","dateModified":"2010-10-30T15:00:00+02:00","inLanguage":"fr-fr","commentCount":1,"mainEntityOfPage":{"@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#webpage"},"isPartOf":{"@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#webpage"},"articleSection":"La Django-app du mois, Django, Python"},{"@type":"BreadcrumbList","@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/j-mad.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/#listItem","name":"D\u00e9veloppement"}},{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/#listItem","position":2,"name":"D\u00e9veloppement","item":"https:\/\/j-mad.com\/blog\/category\/developpement\/","nextItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/#listItem","name":"Python"},"previousItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/#listItem","position":3,"name":"Python","item":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/","nextItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/#listItem","name":"Django"},"previousItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/#listItem","name":"D\u00e9veloppement"}},{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/#listItem","position":4,"name":"Django","item":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/","nextItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/la-django-app-du-mois\/#listItem","name":"La Django-app du mois"},"previousItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/#listItem","name":"Python"}},{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/la-django-app-du-mois\/#listItem","position":5,"name":"La Django-app du mois","item":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/la-django-app-du-mois\/","nextItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#listItem","name":"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats."},"previousItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/#listItem","name":"Django"}},{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#listItem","position":6,"name":"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats.","previousItem":{"@type":"ListItem","@id":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/la-django-app-du-mois\/#listItem","name":"La Django-app du mois"}}]},{"@type":"Organization","@id":"https:\/\/j-mad.com\/blog\/#organization","name":"Le Mad Blog","description":"juste un blog","url":"https:\/\/j-mad.com\/blog\/"},{"@type":"Person","@id":"https:\/\/j-mad.com\/blog\/author\/j-mad\/#author","url":"https:\/\/j-mad.com\/blog\/author\/j-mad\/","name":"J-Mad","image":{"@type":"ImageObject","@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/6eb44e8eb2792583de23c66deb033f8b5ef4f7f7c535464d77cb9f643012d138?s=96&d=retro&r=g","width":96,"height":96,"caption":"J-Mad"}},{"@type":"WebPage","@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#webpage","url":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/","name":"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | Le Mad Blog","description":"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu'on veut filtrer sur des crit\u00e8res temporels.","inLanguage":"fr-fr","isPartOf":{"@id":"https:\/\/j-mad.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/#breadcrumblist"},"author":{"@id":"https:\/\/j-mad.com\/blog\/author\/j-mad\/#author"},"creator":{"@id":"https:\/\/j-mad.com\/blog\/author\/j-mad\/#author"},"datePublished":"2010-10-30T15:00:00+02:00","dateModified":"2010-10-30T15:00:00+02:00"},{"@type":"WebSite","@id":"https:\/\/j-mad.com\/blog\/#website","url":"https:\/\/j-mad.com\/blog\/","name":"Le Mad Blog","description":"juste un blog","inLanguage":"fr-fr","publisher":{"@id":"https:\/\/j-mad.com\/blog\/#organization"}}]},"og:locale":"fr_FR","og:site_name":"Le Mad Blog | juste un blog","og:type":"article","og:title":"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | Le Mad Blog","og:description":"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu'on veut filtrer sur des crit\u00e8res temporels.","og:url":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/","article:published_time":"2010-10-30T13:00:00+00:00","article:modified_time":"2010-10-30T13:00:00+00:00","twitter:card":"summary","twitter:title":"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | Le Mad Blog","twitter:description":"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu'on veut filtrer sur des crit\u00e8res temporels."},"aioseo_meta_data":{"post_id":"1023","title":"Django-qsstats, parce qu'en vrai,on adore tous faire des stats. | #site_title","description":"la django-app du mois. Ce mois ci django-qsstats est une app qui permet de simplifier le filtrage des queryset lorsqu'on veut filtrer sur des crit\u00e8res temporels.","keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[],"defaultGraph":"","defaultPostTypeGraph":""},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2020-12-20 21:05:11","updated":"2025-06-03 21:53:02","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/j-mad.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/j-mad.com\/blog\/category\/developpement\/\" title=\"D\u00e9veloppement\">D\u00e9veloppement<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/\" title=\"Python\">Python<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/\" title=\"Django\">Django<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/la-django-app-du-mois\/\" title=\"La Django-app du mois\">La Django-app du mois<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tDjango-qsstats, parce qu\u2019en vrai,on adore tous faire des stats.\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/j-mad.com\/blog"},{"label":"D\u00e9veloppement","link":"https:\/\/j-mad.com\/blog\/category\/developpement\/"},{"label":"Python","link":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/"},{"label":"Django","link":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/"},{"label":"La Django-app du mois","link":"https:\/\/j-mad.com\/blog\/category\/developpement\/python\/django\/la-django-app-du-mois\/"},{"label":"Django-qsstats, parce qu&#8217;en vrai,on adore tous faire des stats.","link":"https:\/\/j-mad.com\/blog\/2010\/10\/30\/django-qsstats-parce-quen-vraion-adore-tous-faire-des-stats\/"}],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-gv","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/1023","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/comments?post=1023"}],"version-history":[{"count":2,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/1023\/revisions"}],"predecessor-version":[{"id":1025,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/1023\/revisions\/1025"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=1023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=1023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=1023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}