mirror of
				https://github.com/ae-utbm/sith.git
				synced 2025-11-04 02:53:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			3652 lines
		
	
	
		
			94 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			3652 lines
		
	
	
		
			94 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
 | 
						|
<!doctype html>
 | 
						|
<html lang="fr" class="no-js">
 | 
						|
  <head>
 | 
						|
    
 | 
						|
      <meta charset="utf-8">
 | 
						|
      <meta name="viewport" content="width=device-width,initial-scale=1">
 | 
						|
      
 | 
						|
        <meta name="description" content="Le site de l'association des étudiants de l'UTBM">
 | 
						|
      
 | 
						|
      
 | 
						|
      
 | 
						|
        <link rel="canonical" href="https://ae-utbm.github.io/sith/howto/querysets/">
 | 
						|
      
 | 
						|
      
 | 
						|
        <link rel="prev" href="../../tutorial/etransaction/">
 | 
						|
      
 | 
						|
      
 | 
						|
        <link rel="next" href="../migrations/">
 | 
						|
      
 | 
						|
      
 | 
						|
      <link rel="icon" href="../../img/favicon.png">
 | 
						|
      <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
 | 
						|
    
 | 
						|
    
 | 
						|
      
 | 
						|
        <title>L'ORM de Django - Site AE UTBM</title>
 | 
						|
      
 | 
						|
    
 | 
						|
    
 | 
						|
      <link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
 | 
						|
      
 | 
						|
        
 | 
						|
        <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
 | 
						|
      
 | 
						|
      
 | 
						|
 | 
						|
 | 
						|
    
 | 
						|
    
 | 
						|
      
 | 
						|
    
 | 
						|
    
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
 | 
						|
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
 | 
						|
        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
 | 
						|
      
 | 
						|
    
 | 
						|
    
 | 
						|
      <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
 | 
						|
    
 | 
						|
      <link rel="stylesheet" href="../../stylesheets/extra.css">
 | 
						|
    
 | 
						|
    <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
 | 
						|
    
 | 
						|
      
 | 
						|
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
  </head>
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
      
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="deeppurple" data-md-color-accent="deeppurple">
 | 
						|
  
 | 
						|
    
 | 
						|
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
 | 
						|
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
 | 
						|
    <label class="md-overlay" for="__drawer"></label>
 | 
						|
    <div data-md-component="skip">
 | 
						|
      
 | 
						|
        
 | 
						|
        <a href="#les-n1-queries" class="md-skip">
 | 
						|
          Aller au contenu
 | 
						|
        </a>
 | 
						|
      
 | 
						|
    </div>
 | 
						|
    <div data-md-component="announce">
 | 
						|
      
 | 
						|
    </div>
 | 
						|
    
 | 
						|
    
 | 
						|
      
 | 
						|
 | 
						|
  
 | 
						|
 | 
						|
<header class="md-header md-header--shadow" data-md-component="header">
 | 
						|
  <nav class="md-header__inner md-grid" aria-label="En-tête">
 | 
						|
    <a href="../.." title="Site AE UTBM" class="md-header__button md-logo" aria-label="Site AE UTBM" data-md-component="logo">
 | 
						|
      
 | 
						|
  
 | 
						|
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
 | 
						|
 | 
						|
    </a>
 | 
						|
    <label class="md-header__button md-icon" for="__drawer">
 | 
						|
      
 | 
						|
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
 | 
						|
    </label>
 | 
						|
    <div class="md-header__title" data-md-component="header-title">
 | 
						|
      <div class="md-header__ellipsis">
 | 
						|
        <div class="md-header__topic">
 | 
						|
          <span class="md-ellipsis">
 | 
						|
            Site AE UTBM
 | 
						|
          </span>
 | 
						|
        </div>
 | 
						|
        <div class="md-header__topic" data-md-component="header-topic">
 | 
						|
          <span class="md-ellipsis">
 | 
						|
            
 | 
						|
              L'ORM de Django
 | 
						|
            
 | 
						|
          </span>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
    
 | 
						|
      
 | 
						|
        <form class="md-header__option" data-md-component="palette">
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="deeppurple" data-md-color-accent="deeppurple"  aria-label="Switch to dark mode"  type="radio" name="__palette" id="__palette_0">
 | 
						|
    
 | 
						|
      <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
 | 
						|
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
 | 
						|
      </label>
 | 
						|
    
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="blue" data-md-color-accent="blue"  aria-label="Switch to light mode"  type="radio" name="__palette" id="__palette_1">
 | 
						|
    
 | 
						|
      <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
 | 
						|
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg>
 | 
						|
      </label>
 | 
						|
    
 | 
						|
  
 | 
						|
</form>
 | 
						|
      
 | 
						|
    
 | 
						|
    
 | 
						|
      <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
      
 | 
						|
      
 | 
						|
        <label class="md-header__button md-icon" for="__search">
 | 
						|
          
 | 
						|
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
 | 
						|
        </label>
 | 
						|
        <div class="md-search" data-md-component="search" role="dialog">
 | 
						|
  <label class="md-search__overlay" for="__search"></label>
 | 
						|
  <div class="md-search__inner" role="search">
 | 
						|
    <form class="md-search__form" name="search">
 | 
						|
      <input type="text" class="md-search__input" name="query" aria-label="Rechercher" placeholder="Rechercher" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
 | 
						|
      <label class="md-search__icon md-icon" for="__search">
 | 
						|
        
 | 
						|
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
 | 
						|
        
 | 
						|
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
 | 
						|
      </label>
 | 
						|
      <nav class="md-search__options" aria-label="Recherche">
 | 
						|
        
 | 
						|
        <button type="reset" class="md-search__icon md-icon" title="Effacer" aria-label="Effacer" tabindex="-1">
 | 
						|
          
 | 
						|
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
 | 
						|
        </button>
 | 
						|
      </nav>
 | 
						|
      
 | 
						|
    </form>
 | 
						|
    <div class="md-search__output">
 | 
						|
      <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
 | 
						|
        <div class="md-search-result" data-md-component="search-result">
 | 
						|
          <div class="md-search-result__meta">
 | 
						|
            Initialisation de la recherche
 | 
						|
          </div>
 | 
						|
          <ol class="md-search-result__list" role="presentation"></ol>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</div>
 | 
						|
      
 | 
						|
    
 | 
						|
    
 | 
						|
      <div class="md-header__source">
 | 
						|
        <a href="https://github.com/ae-utbm/sith" title="Aller au dépôt" class="md-source" data-md-component="source">
 | 
						|
  <div class="md-source__icon md-icon">
 | 
						|
    
 | 
						|
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
 | 
						|
  </div>
 | 
						|
  <div class="md-source__repository">
 | 
						|
    sith
 | 
						|
  </div>
 | 
						|
</a>
 | 
						|
      </div>
 | 
						|
    
 | 
						|
  </nav>
 | 
						|
  
 | 
						|
</header>
 | 
						|
    
 | 
						|
    <div class="md-container" data-md-component="container">
 | 
						|
      
 | 
						|
      
 | 
						|
        
 | 
						|
          
 | 
						|
        
 | 
						|
      
 | 
						|
      <main class="md-main" data-md-component="main">
 | 
						|
        <div class="md-main__inner md-grid">
 | 
						|
          
 | 
						|
            
 | 
						|
              
 | 
						|
              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
 | 
						|
                <div class="md-sidebar__scrollwrap">
 | 
						|
                  <div class="md-sidebar__inner">
 | 
						|
                    
 | 
						|
 | 
						|
 | 
						|
 | 
						|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
 | 
						|
  <label class="md-nav__title" for="__drawer">
 | 
						|
    <a href="../.." title="Site AE UTBM" class="md-nav__button md-logo" aria-label="Site AE UTBM" data-md-component="logo">
 | 
						|
      
 | 
						|
  
 | 
						|
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
 | 
						|
 | 
						|
    </a>
 | 
						|
    Site AE UTBM
 | 
						|
  </label>
 | 
						|
  
 | 
						|
    <div class="md-nav__source">
 | 
						|
      <a href="https://github.com/ae-utbm/sith" title="Aller au dépôt" class="md-source" data-md-component="source">
 | 
						|
  <div class="md-source__icon md-icon">
 | 
						|
    
 | 
						|
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
 | 
						|
  </div>
 | 
						|
  <div class="md-source__repository">
 | 
						|
    sith
 | 
						|
  </div>
 | 
						|
</a>
 | 
						|
    </div>
 | 
						|
  
 | 
						|
  <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
    
 | 
						|
      
 | 
						|
      
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../.." class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Accueil
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
    
 | 
						|
      
 | 
						|
      
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Explications
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_2">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            Explications
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../explanation/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Accueil
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../explanation/technos/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Technologies utilisées
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../explanation/conventions/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Conventions
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../explanation/archives/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Archives
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
    
 | 
						|
      
 | 
						|
      
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Tutoriels
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_3">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            Tutoriels
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/install/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Installer le projet
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/install-advanced/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Installer le projet (avancé)
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/devtools/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Configurer son éditeur
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/structure/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Structure du projet
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/perms/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Gestion des permissions
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/groups/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Gestion des groupes
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/fragments/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Les fragments
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_8" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_3_8" id="__nav_3_8_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    API
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_8_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_3_8">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            API
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/api/dev/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Développement
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/api/connect/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Connexion à l'API
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../tutorial/etransaction/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Etransactions
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
    
 | 
						|
      
 | 
						|
      
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--active md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    How-to
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
 | 
						|
          <label class="md-nav__title" for="__nav_4">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            How-to
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item md-nav__item--active">
 | 
						|
      
 | 
						|
      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
 | 
						|
      
 | 
						|
      
 | 
						|
      
 | 
						|
        <label class="md-nav__link md-nav__link--active" for="__toc">
 | 
						|
          
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    L'ORM de Django
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
          <span class="md-nav__icon md-icon"></span>
 | 
						|
        </label>
 | 
						|
      
 | 
						|
      <a href="./" class="md-nav__link md-nav__link--active">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    L'ORM de Django
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
      
 | 
						|
        
 | 
						|
 | 
						|
<nav class="md-nav md-nav--secondary" aria-label="Table des matières">
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <label class="md-nav__title" for="__toc">
 | 
						|
      <span class="md-nav__icon md-icon"></span>
 | 
						|
      Table des matières
 | 
						|
    </label>
 | 
						|
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
 | 
						|
      
 | 
						|
        <li class="md-nav__item">
 | 
						|
  <a href="#les-n1-queries" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Les N+1 queries
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
    <nav class="md-nav" aria-label="Les N+1 queries">
 | 
						|
      <ul class="md-nav__list">
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#le-probleme" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Le problème
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#select_related" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      select_related
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#prefetch_related" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      prefetch_related
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#recuperer-ce-dont-vous-avez-besoin" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Récupérer ce dont vous avez besoin
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
      </ul>
 | 
						|
    </nav>
 | 
						|
  
 | 
						|
</li>
 | 
						|
      
 | 
						|
        <li class="md-nav__item">
 | 
						|
  <a href="#les-aggregations-manquees" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Les aggrégations manquées
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
      
 | 
						|
        <li class="md-nav__item">
 | 
						|
  <a href="#benchmark" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Benchmark
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
    <nav class="md-nav" aria-label="Benchmark">
 | 
						|
      <ul class="md-nav__list">
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#ce-quil-faut-mesurer" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Ce qu'il faut mesurer
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#django-debug-toolbar" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      django-debug-toolbar
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#connectionqueries" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      connection.queries
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#assertnumqueries" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      assertNumQueries
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
      </ul>
 | 
						|
    </nav>
 | 
						|
  
 | 
						|
</li>
 | 
						|
      
 | 
						|
    </ul>
 | 
						|
  
 | 
						|
</nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../migrations/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Gérer les migrations
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../translation/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Gérer les traductions
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../statics/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Gérer les statics
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../js-import-paths/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Ajouter un chemin d'import javascript
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../prod/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Configurer pour la production
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../logo/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Ajouter un logo de promo
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../subscriptions/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Ajouter une cotisation
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../weekmail/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Modifier le weekmail
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../terminal/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Terminal
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../direnv/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Direnv
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
    
 | 
						|
      
 | 
						|
      
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Reference
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            Reference
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    antispam
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_1">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            antispam
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/antispam/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/antispam/forms/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Forms
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    api
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_2">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            api
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/api/auth/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Auth
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/api/hashers/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Hashers
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/api/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/api/perms/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Perms
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_3" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_3" id="__nav_5_3_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    club
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_3_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_3">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            club
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/club/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/club/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_4" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_4" id="__nav_5_4_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    com
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_4_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_4">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            com
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/com/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/com/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_5" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_5" id="__nav_5_5_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    core
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_5_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_5">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            core
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/core/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/core/model_fields/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Champs de modèle
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/core/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/core/mixins/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Mixins
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/core/schemas/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Schemas
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/core/auth/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Auth
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_6" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_6" id="__nav_5_6_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    counter
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_6_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_6">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            counter
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/counter/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/counter/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/counter/schemas/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Schemas
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_7" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_7" id="__nav_5_7_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    eboutic
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_7_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_7">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            eboutic
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/eboutic/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/eboutic/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_8" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_8" id="__nav_5_8_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    election
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_8_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_8">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            election
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/election/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/election/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_9" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_9" id="__nav_5_9_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    forum
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_9_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_9">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            forum
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/forum/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/forum/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_10" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_10" id="__nav_5_10_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    galaxy
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_10_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_10">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            galaxy
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/galaxy/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/galaxy/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_11" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_11" id="__nav_5_11_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    matmat
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_11_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_11">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            matmat
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/matmat/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/matmat/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_12" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_12" id="__nav_5_12_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    pedagogy
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_12_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_12">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            pedagogy
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/pedagogy/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/pedagogy/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/pedagogy/schemas/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Schemas
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_13" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_13" id="__nav_5_13_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    rootplace
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_13_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_13">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            rootplace
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/rootplace/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/rootplace/forms/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Forms
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/rootplace/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_14" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_14" id="__nav_5_14_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    sas
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_14_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_14">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            sas
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/sas/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/sas/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/sas/schemas/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Schemas
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_15" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_15" id="__nav_5_15_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    staticfiles
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_15_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_15">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            staticfiles
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/staticfiles/apps/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Apps
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/staticfiles/storage/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Storage
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/staticfiles/finders/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Finders
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/staticfiles/processors/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Processors
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_16" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_16" id="__nav_5_16_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    subscription
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_16_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_16">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            subscription
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/subscription/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/subscription/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
    <li class="md-nav__item md-nav__item--nested">
 | 
						|
      
 | 
						|
        
 | 
						|
        
 | 
						|
        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_17" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <label class="md-nav__link" for="__nav_5_17" id="__nav_5_17_label" tabindex="0">
 | 
						|
            
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    trombi
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
          </label>
 | 
						|
        
 | 
						|
        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_17_label" aria-expanded="false">
 | 
						|
          <label class="md-nav__title" for="__nav_5_17">
 | 
						|
            <span class="md-nav__icon md-icon"></span>
 | 
						|
            trombi
 | 
						|
          </label>
 | 
						|
          <ul class="md-nav__list" data-md-scrollfix>
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/trombi/models/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Models
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
              
 | 
						|
                
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <li class="md-nav__item">
 | 
						|
      <a href="../../reference/trombi/views/" class="md-nav__link">
 | 
						|
        
 | 
						|
  
 | 
						|
  
 | 
						|
  <span class="md-ellipsis">
 | 
						|
    Views
 | 
						|
    
 | 
						|
  </span>
 | 
						|
  
 | 
						|
 | 
						|
      </a>
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
              
 | 
						|
            
 | 
						|
          </ul>
 | 
						|
        </nav>
 | 
						|
      
 | 
						|
    </li>
 | 
						|
  
 | 
						|
 | 
						|
    
 | 
						|
  </ul>
 | 
						|
</nav>
 | 
						|
                  </div>
 | 
						|
                </div>
 | 
						|
              </div>
 | 
						|
            
 | 
						|
            
 | 
						|
              
 | 
						|
              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
 | 
						|
                <div class="md-sidebar__scrollwrap">
 | 
						|
                  <div class="md-sidebar__inner">
 | 
						|
                    
 | 
						|
 | 
						|
<nav class="md-nav md-nav--secondary" aria-label="Table des matières">
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
  
 | 
						|
    <label class="md-nav__title" for="__toc">
 | 
						|
      <span class="md-nav__icon md-icon"></span>
 | 
						|
      Table des matières
 | 
						|
    </label>
 | 
						|
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
 | 
						|
      
 | 
						|
        <li class="md-nav__item">
 | 
						|
  <a href="#les-n1-queries" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Les N+1 queries
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
    <nav class="md-nav" aria-label="Les N+1 queries">
 | 
						|
      <ul class="md-nav__list">
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#le-probleme" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Le problème
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#select_related" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      select_related
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#prefetch_related" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      prefetch_related
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#recuperer-ce-dont-vous-avez-besoin" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Récupérer ce dont vous avez besoin
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
      </ul>
 | 
						|
    </nav>
 | 
						|
  
 | 
						|
</li>
 | 
						|
      
 | 
						|
        <li class="md-nav__item">
 | 
						|
  <a href="#les-aggregations-manquees" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Les aggrégations manquées
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
      
 | 
						|
        <li class="md-nav__item">
 | 
						|
  <a href="#benchmark" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Benchmark
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
    <nav class="md-nav" aria-label="Benchmark">
 | 
						|
      <ul class="md-nav__list">
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#ce-quil-faut-mesurer" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      Ce qu'il faut mesurer
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#django-debug-toolbar" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      django-debug-toolbar
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#connectionqueries" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      connection.queries
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
          <li class="md-nav__item">
 | 
						|
  <a href="#assertnumqueries" class="md-nav__link">
 | 
						|
    <span class="md-ellipsis">
 | 
						|
      assertNumQueries
 | 
						|
    </span>
 | 
						|
  </a>
 | 
						|
  
 | 
						|
</li>
 | 
						|
        
 | 
						|
      </ul>
 | 
						|
    </nav>
 | 
						|
  
 | 
						|
</li>
 | 
						|
      
 | 
						|
    </ul>
 | 
						|
  
 | 
						|
</nav>
 | 
						|
                  </div>
 | 
						|
                </div>
 | 
						|
              </div>
 | 
						|
            
 | 
						|
          
 | 
						|
          
 | 
						|
            <div class="md-content" data-md-component="content">
 | 
						|
              <article class="md-content__inner md-typeset">
 | 
						|
                
 | 
						|
                  
 | 
						|
 | 
						|
 | 
						|
  
 | 
						|
  
 | 
						|
 | 
						|
 | 
						|
  <h1>L'ORM de Django</h1>
 | 
						|
 | 
						|
<p>L'ORM de Django est puissant, très puissant, non par parce qu'il
 | 
						|
est performant (après tout, ce n'est qu'une interface, le gros du boulot,
 | 
						|
c'est la db qui le fait), mais parce qu'il permet d'écrire
 | 
						|
de manière relativement simple un grand panel de requêtes.</p>
 | 
						|
<p>De manière générale, puisqu'un ORM est un système
 | 
						|
consistant à manipuler avec un code orienté-objet
 | 
						|
une db relationnelle (c'est-à-dire deux paradigmes
 | 
						|
qui ne fonctionnent absolument pas pareil),
 | 
						|
on rencontre un des deux problèmes suivants :</p>
 | 
						|
<ul>
 | 
						|
<li>soit l'ORM n'offre pas assez d'abstraction,
 | 
						|
  auquel cas, quand on veut faire des requêtes
 | 
						|
  plus complexes qu'un <code>select</code> avec un <code>where</code>,
 | 
						|
  on s'emmêle les pinceaux et on se dit que
 | 
						|
  ça aurait été plus simple de le faire directement
 | 
						|
  en SQL.</li>
 | 
						|
<li>soit l'ORM offre trop d'abstraction,
 | 
						|
  auquel cas, on a tendance à ne pas prêter
 | 
						|
  assez attention aux requêtes envoyées en base
 | 
						|
  de données et on finit par se rendre compte
 | 
						|
  que les temps d'attente explosent
 | 
						|
  parce qu'on envoie trop de requêtes.</li>
 | 
						|
</ul>
 | 
						|
<p>Django est dans ce deuxième cas.</p>
 | 
						|
<p>C'est pourquoi nous ne parlerons pas ici
 | 
						|
de son fonctionnement exact ni de toutes les fonctions
 | 
						|
que l'on peut utiliser 
 | 
						|
(la <a href="https://docs.djangoproject.com/fr/stable/topics/db/queries/">doc officielle</a> fait déjà ça mieux que nous),
 | 
						|
mais plutôt des pièges courants
 | 
						|
et des astuces pour les éviter.</p>
 | 
						|
<h2 id="les-n1-queries">Les <code>N+1 queries</code><a class="headerlink" href="#les-n1-queries" title="Permanent link">¶</a></h2>
 | 
						|
<h3 id="le-probleme">Le problème<a class="headerlink" href="#le-probleme" title="Permanent link">¶</a></h3>
 | 
						|
<p>Normalement, quand on veut récupérer une liste,
 | 
						|
on fait une requête et c'est fini.
 | 
						|
Mais des fois, ça n'est pas si simple.
 | 
						|
Par exemple, supposons que nous voulons
 | 
						|
récupérer les 100 utilisateurs les plus riches,
 | 
						|
avec leurs informations client :</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>
 | 
						|
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">"-customer__amount"</span><span class="p">)[:</span><span class="mi">100</span><span class="p">]:</span>
 | 
						|
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>    <span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">customer</span><span class="o">.</span><span class="n">amount</span><span class="p">)</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<p>Combien de requêtes le bout de code suivant effectue-t-il ?
 | 
						|
101.
 | 
						|
En deux pauvres lignes de code, nous avons demandé
 | 
						|
à la base de données d'effectuer 101 requêtes.
 | 
						|
Une requête toute seule n'est déjà une opération anodine,
 | 
						|
alors je vous laisse imaginer ce que ça donne pour 101.</p>
 | 
						|
<p>Si vous ne comprenez pourquoi ce nombre, c'est très simple :</p>
 | 
						|
<ul>
 | 
						|
<li>Une requête pour sélectionner nos 100 utilisateurs</li>
 | 
						|
<li>Une requête supplémentaire pour récupérer les informations
 | 
						|
  client de chaque utilisateur, soit 100 requêtes.</li>
 | 
						|
</ul>
 | 
						|
<p>En effet, les informations client sont stockées dans une
 | 
						|
autre table, mais le fait d'établir un lien de clef
 | 
						|
étrangère permet de manipuler <code>customer</code>
 | 
						|
comme si c'était un membre à part entière de <code>User</code>.</p>
 | 
						|
<p>Il est à noter cependant, que Django n'effectue une requête
 | 
						|
que pour le premier accès à un membre d'une relation
 | 
						|
de clef étrangère.
 | 
						|
Toutes les fois suivantes, l'objet est déjà là,
 | 
						|
et django le récupère :</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>
 | 
						|
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="c1"># l'utilisateur le plus riche</span>
 | 
						|
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">"-customer__amount"</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>  <span class="c1"># <-- requête db</span>
 | 
						|
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">customer</span><span class="o">.</span><span class="n">amount</span><span class="p">)</span>  <span class="c1"># <-- requête db</span>
 | 
						|
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">customer</span><span class="o">.</span><span class="n">account_id</span><span class="p">)</span>  <span class="c1"># on a déjà récupéré `customer`, donc pas de requête</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<p>Ce n'est donc pas gravissime si vous faites cette
 | 
						|
erreur quand vous manipulez un seul objet.
 | 
						|
En revanche, quand vous en manipulez plusieurs,
 | 
						|
il faut régler le problème.
 | 
						|
Pour ça, il y a plusieurs méthodes, en fonction de votre cas.</p>
 | 
						|
<h3 id="select_related"><code>select_related</code><a class="headerlink" href="#select_related" title="Permanent link">¶</a></h3>
 | 
						|
<p>La méthode la plus basique consiste à annoter le queryset,
 | 
						|
avec la méthode <code>select_related()</code>.
 | 
						|
En faisant ça, Django fera une jointure sur l'autre table
 | 
						|
et demandera des informations en plus
 | 
						|
à la db lors de la requête.</p>
 | 
						|
<p>De la sorte, lorsque vous appellerez le membre relié,
 | 
						|
les informations seront déjà là.</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>
 | 
						|
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="n">richest</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">"-customer__amount"</span><span class="p">)</span>
 | 
						|
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">richest</span><span class="o">.</span><span class="n">select_related</span><span class="p">(</span><span class="s2">"customer"</span><span class="p">)[:</span><span class="mi">100</span><span class="p">]:</span>
 | 
						|
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>    <span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">customer</span><span class="p">)</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<p>Le code ci-dessus effectue une seule requête.
 | 
						|
Chaque fois qu'on veut accéder à <code>customer</code>, c'est bon,
 | 
						|
ça a déjà été récupéré à travers le <code>select_related</code>.</p>
 | 
						|
<h3 id="prefetch_related"><code>prefetch_related</code><a class="headerlink" href="#prefetch_related" title="Permanent link">¶</a></h3>
 | 
						|
<p>Maintenant, un cas plus compliqué.
 | 
						|
Supposons que vous ne vouliez pas récupérer des informations
 | 
						|
reliées par une relation One-to-One,
 | 
						|
mais par une relation One-to-Many.</p>
 | 
						|
<p>Par exemple, un utilisateur a un seul compte client,
 | 
						|
mais il peut avoir plusieurs cotisations à son actif.
 | 
						|
Et dans ces cas-là, <code>annotate</code> ne marche plus.
 | 
						|
En effet, s'il peut exister plusieurs cotisations,
 | 
						|
comment savoir laquelle on veut ?</p>
 | 
						|
<p>Il faut alors utiliser un <code>prefetch_related</code>.
 | 
						|
C'est un mécanisme un peu différent :
 | 
						|
au lieu de faire une jointure et d'ajouter les informations
 | 
						|
voulues dans la même requête, Django va effectuer
 | 
						|
une deuxième requête pour récupérer les éléments de l'autre table,
 | 
						|
puis, à partir de ces éléments, peupler la relation
 | 
						|
de son côté.</p>
 | 
						|
<p>C'est un mécanisme qui peut être un peu coûteux en mémoire
 | 
						|
et qui demande une deuxième requête,
 | 
						|
mais qui reste quand même largement préférable
 | 
						|
à faire N requêtes en plus.</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>
 | 
						|
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">prefetch_related</span><span class="p">(</span><span class="s2">"subscriptions"</span><span class="p">)[:</span><span class="mi">100</span><span class="p">]:</span>
 | 
						|
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>    <span class="c1"># c'est bon, la méthode prefetch a récupéré en avance les `subscriptions`</span>
 | 
						|
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>    <span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<div class="admonition danger">
 | 
						|
<p class="admonition-title">Danger</p>
 | 
						|
<p>La méthode <code>prefetch_related</code> ne marche que si vous
 | 
						|
utilisez la méthode <code>all()</code> pour accéder au membre.
 | 
						|
Si vous utilisez une autre méthode (comme <code>filter</code> ou <code>annotate</code>),
 | 
						|
alors Django effectuera une nouvelle requête,
 | 
						|
et vous retomberez dans le problème initial.</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Count</span>
 | 
						|
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>
 | 
						|
</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">prefetch_related</span><span class="p">(</span><span class="s2">"subscriptions"</span><span class="p">)[:</span><span class="mi">100</span><span class="p">]:</span>
 | 
						|
</span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a>    <span class="c1"># Le prefetch_related ne marche plus !</span>
 | 
						|
</span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>    <span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">subscriptions</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="n">count</span><span class="o">=</span><span class="n">Count</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)))</span>
 | 
						|
</span></code></pre></div>
 | 
						|
</div>
 | 
						|
<h3 id="recuperer-ce-dont-vous-avez-besoin">Récupérer ce dont vous avez besoin<a class="headerlink" href="#recuperer-ce-dont-vous-avez-besoin" title="Permanent link">¶</a></h3>
 | 
						|
<p>Des fois (souvent, même), penser explicitement
 | 
						|
à la jointure est le meilleur choix.</p>
 | 
						|
<p>En effet, vous remarquerez que dans tous
 | 
						|
les exemples précédents, nous n'utilisions
 | 
						|
qu'une partie des informations 
 | 
						|
(par exemple, nous ne récupérions que la somme
 | 
						|
d'argent sur les comptes, et éventuellement le numéro de compte).</p>
 | 
						|
<p>Nous pouvons utiliser la méthode <code>annotate</code>
 | 
						|
pour spécifier explicitement les données que l'on veut
 | 
						|
joindre à notre requête.</p>
 | 
						|
<p>Quand nous voulions récupérer les informations utilisateur,
 | 
						|
nous aurions tout aussi bien pu écrire :</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">F</span>
 | 
						|
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
 | 
						|
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="n">richest</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">"-customer__amount"</span><span class="p">)</span>
 | 
						|
</span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">richest</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="n">amount</span><span class="o">=</span><span class="n">F</span><span class="p">(</span><span class="s2">"customer__amount"</span><span class="p">))[:</span><span class="mi">100</span><span class="p">]:</span>
 | 
						|
</span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>    <span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">amount</span><span class="p">)</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<p>On aurait même pu réorganiser ça :
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">F</span>
 | 
						|
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>
 | 
						|
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="n">richest</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="n">amount</span><span class="o">=</span><span class="n">F</span><span class="p">(</span><span class="s2">"customer__amount"</span><span class="p">))</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">"-amount"</span><span class="p">)</span>
 | 
						|
</span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">richest</span><span class="p">[:</span><span class="mi">100</span><span class="p">]:</span>
 | 
						|
</span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>    <span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">amount</span><span class="p">)</span>
 | 
						|
</span></code></pre></div></p>
 | 
						|
<p>Ça peut sembler moins bien qu'un <code>select_related</code>, comme ça.
 | 
						|
Des fois, c'est en effet moins bien, et des fois c'est mieux.
 | 
						|
La comparaison est plus évidente avec le <code>prefetch_related</code>.</p>
 | 
						|
<p>En effet, quand nous voulions récupérer
 | 
						|
le nombre de cotisations des utilisateurs,
 | 
						|
le <code>prefetch_related</code> ne marchait plus.
 | 
						|
Pourtant, nous voulions récupérer une seule information.</p>
 | 
						|
<p>Il aurait donc été suffisant d'écrire :
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Count</span>
 | 
						|
</span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>
 | 
						|
</span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="n">nb_subscriptions</span><span class="o">=</span><span class="n">Count</span><span class="p">(</span><span class="s2">"subscriptions"</span><span class="p">))[:</span><span class="mi">100</span><span class="p">]:</span>
 | 
						|
</span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a>    <span class="c1"># Et là ça marche, en une seule requête.</span>
 | 
						|
</span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a>    <span class="nb">print</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">nb_subscriptions</span><span class="p">)</span>
 | 
						|
</span></code></pre></div></p>
 | 
						|
<p>Faire une jointure, c'est normal en SQL.
 | 
						|
Et pourtant avec Django on les oublie trop facilement.
 | 
						|
Posez-vous toujours la question des données que vous pourriez
 | 
						|
avoir besoin d'annoter, et vous éviterez beaucoup d'ennuis.</p>
 | 
						|
<h2 id="les-aggregations-manquees">Les aggrégations manquées<a class="headerlink" href="#les-aggregations-manquees" title="Permanent link">¶</a></h2>
 | 
						|
<p>Il arrive souvent que l'on veuille une information qui
 | 
						|
porte sur un ensemble d'objets de notre db.</p>
 | 
						|
<p>Imaginons par exemple que nous voulons connaitre
 | 
						|
la somme totale des ventes faites à un comptoir.</p>
 | 
						|
<p>Nous avons tous suivi nos cours de programmation,
 | 
						|
nous écrivons donc instinctivement :</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">counter.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Counter</span>
 | 
						|
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a>
 | 
						|
</span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="n">foyer</span> <span class="o">=</span> <span class="n">Counter</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Foyer"</span><span class="p">)</span>
 | 
						|
</span><span id="__span-8-4"><a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a><span class="n">total_amount</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span>
 | 
						|
</span><span id="__span-8-5"><a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a>    <span class="n">sale</span><span class="o">.</span><span class="n">amount</span> <span class="o">*</span> <span class="n">sale</span><span class="o">.</span><span class="n">unit_price</span>
 | 
						|
</span><span id="__span-8-6"><a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a>    <span class="k">for</span> <span class="n">sale</span> <span class="ow">in</span> <span class="n">foyer</span><span class="o">.</span><span class="n">sellings</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
 | 
						|
</span><span id="__span-8-7"><a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="p">)</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<p>On pourrait penser qu'il n'y a pas de problème.
 | 
						|
Après tout, on ne fait qu'une seule requête.
 | 
						|
Eh bien si, il y a un problème :
 | 
						|
on fait beaucoup de choses en trop.</p>
 | 
						|
<p>Concrètement, on demande à la base de données
 | 
						|
de renvoyer toutes les informations,
 | 
						|
ce qui rallonge inutilement la durée
 | 
						|
de l'échange entre le serveur et la db,
 | 
						|
puis on perd du temps à convertir ces informations
 | 
						|
en objets Python (opération qui a un coût également),
 | 
						|
et enfin on reperd du temps à calculer en Python
 | 
						|
quelque chose que la db aurait pu calculer
 | 
						|
à notre plus bien plus vite.</p>
 | 
						|
<p>Nous aurions dû aggréger la requête,
 | 
						|
avec la méthode <code>aggregate</code> :</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">counter.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Counter</span>
 | 
						|
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Sum</span><span class="p">,</span> <span class="n">F</span>
 | 
						|
</span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>
 | 
						|
</span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="n">foyer</span> <span class="o">=</span> <span class="n">Counter</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Foyer"</span><span class="p">)</span>
 | 
						|
</span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="n">total_amount</span> <span class="o">=</span> <span class="p">(</span>
 | 
						|
</span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a>    <span class="n">foyer</span><span class="o">.</span><span class="n">sellings</span><span class="o">.</span><span class="n">aggregate</span><span class="p">(</span><span class="n">amount</span><span class="o">=</span><span class="n">Sum</span><span class="p">(</span><span class="n">F</span><span class="p">(</span><span class="s2">"amount"</span><span class="p">)</span> <span class="o">*</span> <span class="n">F</span><span class="p">(</span><span class="s2">"unit_price"</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span>
 | 
						|
</span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a><span class="p">)[</span><span class="s2">"amount__sum"</span><span class="p">]</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<p>En effectuant cette requête, la base de données nous renverra exactement
 | 
						|
l'information dont nous avons besoin.
 | 
						|
Et de notre côté, nous n'aurons pas à faire de traitement en plus.</p>
 | 
						|
<h2 id="benchmark">Benchmark<a class="headerlink" href="#benchmark" title="Permanent link">¶</a></h2>
 | 
						|
<h3 id="ce-quil-faut-mesurer">Ce qu'il faut mesurer<a class="headerlink" href="#ce-quil-faut-mesurer" title="Permanent link">¶</a></h3>
 | 
						|
<p>Quand on parle d'interaction avec une base de données,
 | 
						|
la question de la performance est cruciale.
 | 
						|
Et quand on parle de performance, on en vient
 | 
						|
forcément à parler d'optimisation.</p>
 | 
						|
<p>Or, pour optimiser, il faut savoir quoi optimiser.
 | 
						|
C'est-à-dire qu'il nous faut un benchmark pour
 | 
						|
étudier les performances réelles de notre code.
 | 
						|
En ce qui concerne des requêtes à une base de données,
 | 
						|
deux aspects sont étudiables :</p>
 | 
						|
<ul>
 | 
						|
<li>le nombre de requêtes qu'une vue ou une fonction
 | 
						|
  effectue pour son fonctionnement.</li>
 | 
						|
<li>le temps d'exécution individuel des requêtes les plus longues.</li>
 | 
						|
</ul>
 | 
						|
<p>Le premier aspect est celui qui nous intéresse le plus,
 | 
						|
puisqu'il est relié au problème le plus fréquent
 | 
						|
et le plus facile à mesurer.
 | 
						|
Le second aspect, au contraire, est bien moins fréquent
 | 
						|
(dans 99% des cas, une requête complexe prendra
 | 
						|
moins de temps que deux requêtes, même simples)
 | 
						|
et bien plus dur à mesurer (il faut réussir à faire des mesures fiables,
 | 
						|
dans un environnement proche de celui de la prod, avec les données de la prod).</p>
 | 
						|
<p>Nous considérerons donc que dans la quasi-totalité des cas,
 | 
						|
le problème vient du nombre de requêtes, pas du temps d'exécution
 | 
						|
d'une requête en particulier.
 | 
						|
Partez du principe que moins vous faites de requêtes, mieux c'est,
 | 
						|
sans prêter attention au temps d'exécution des requêtes.</p>
 | 
						|
<p>Pour quantifier de manière fiables les requêtes effectuées,
 | 
						|
il y a quelques outils.</p>
 | 
						|
<h3 id="django-debug-toolbar"><code>django-debug-toolbar</code><a class="headerlink" href="#django-debug-toolbar" title="Permanent link">¶</a></h3>
 | 
						|
<p>La <code>django-debug-toolbar</code> est une interface disponible
 | 
						|
sur toutes les pages quand vous êtes en mode debug.
 | 
						|
Elle s'affiche à droite et vous permet de voir toutes sortes
 | 
						|
d'informations, parmi lesquelles le nombre de requêtes effectuées.</p>
 | 
						|
<p>Cette interface est très pratique, puisqu'elle va plus loin
 | 
						|
que simplement compter les requêtes,
 | 
						|
elle vous donne également le SQL qui a été utilisé,
 | 
						|
l'endroit du code, avec fichier et numéro de ligne,
 | 
						|
où cette requête a été faite et, encore mieux,
 | 
						|
elle vous indique quelles requêtes semblent dupliquées.</p>
 | 
						|
<p>Quand <code>django-debug-toolbar</code> vous indique qu'une requête
 | 
						|
a été dupliquée quatre fois, cinq fois, ou même deux cent fois
 | 
						|
(le chiffre peut sembler énorme, mais c'est déjà arrivé),
 | 
						|
vous pouvez être sûr qu'il y a là quelque chose à optimiser.</p>
 | 
						|
<div class="admonition warning">
 | 
						|
<p class="admonition-title">Warning</p>
 | 
						|
<p>Le widget de <code>django-debug-toolbar</code> ne s'affiche
 | 
						|
que sur les pages html.
 | 
						|
Si vous voulez étudier autre chose,
 | 
						|
comme une simple fonction,
 | 
						|
ou bien comme une vue retournant du JSON,
 | 
						|
vous n'aurez donc pas <code>django-debug-toolbar</code>.</p>
 | 
						|
</div>
 | 
						|
<h3 id="connectionqueries"><code>connection.queries</code><a class="headerlink" href="#connectionqueries" title="Permanent link">¶</a></h3>
 | 
						|
<p>Quand vous voulez examiner les requêtes d'un bout de code
 | 
						|
en particulier, Django met à disposition un mécanisme
 | 
						|
permettant d'examiner toutes les requêtes qui sont faites :
 | 
						|
<code>connection.queries</code></p>
 | 
						|
<p>C'est un historique de toutes les requêtes effectuées,
 | 
						|
qui est assez simple à utiliser :</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.db</span><span class="w"> </span><span class="kn">import</span> <span class="n">connection</span>
 | 
						|
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
 | 
						|
</span><span id="__span-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a>
 | 
						|
</span><span id="__span-10-4"><a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a><span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">connection</span><span class="o">.</span><span class="n">queries</span><span class="p">))</span>  <span class="c1"># 0</span>
 | 
						|
</span><span id="__span-10-5"><a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a>
 | 
						|
</span><span id="__span-10-6"><a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="n">nb_users</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
 | 
						|
</span><span id="__span-10-7"><a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a>
 | 
						|
</span><span id="__span-10-8"><a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a><span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">connection</span><span class="o">.</span><span class="n">queries</span><span class="p">))</span>  <span class="c1"># 1</span>
 | 
						|
</span><span id="__span-10-9"><a id="__codelineno-10-9" name="__codelineno-10-9" href="#__codelineno-10-9"></a><span class="nb">print</span><span class="p">(</span><span class="n">connection</span><span class="o">.</span><span class="n">queries</span><span class="p">)</span>  <span class="c1"># affiche toutes les requêtes effectuées</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<h3 id="assertnumqueries"><code>assertNumQueries</code><a class="headerlink" href="#assertnumqueries" title="Permanent link">¶</a></h3>
 | 
						|
<p>Quand on a mis en place une fonctionnalité,
 | 
						|
ou qu'on en a amélioré les performances,
 | 
						|
on veut absolument éviter la régression.</p>
 | 
						|
<p>Or, une régression ne se manifeste pas forcément
 | 
						|
dans l'apparition d'un bug : ça peut aussi
 | 
						|
être une augmentation du temps d'exécution, possiblement
 | 
						|
causé par une augmentation du nombre de requêtes.</p>
 | 
						|
<p>C'est pour ça que django met à disposition un moyen
 | 
						|
de tester automatiquement le nombre de requêtes :
 | 
						|
<code>assertNumQueries</code>.</p>
 | 
						|
<p>Il s'agit d'un gestionnaire de contexte accessible
 | 
						|
dans les tests, qui teste le nombre de requêtes
 | 
						|
effectuées en son sein.</p>
 | 
						|
<p>Par exemple :</p>
 | 
						|
<div class="language-python highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.test</span><span class="w"> </span><span class="kn">import</span> <span class="n">TestCase</span>
 | 
						|
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.shortcuts</span><span class="w"> </span><span class="kn">import</span> <span class="n">reverse</span>
 | 
						|
</span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a>
 | 
						|
</span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a>
 | 
						|
</span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooTest</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
 | 
						|
</span><span id="__span-11-6"><a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a>    <span class="k">def</span><span class="w"> </span><span class="nf">test_nb_queries</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
 | 
						|
</span><span id="__span-11-7"><a id="__codelineno-11-7" name="__codelineno-11-7" href="#__codelineno-11-7"></a><span class="w">        </span><span class="sd">"""Test that the number of db queries is stable."""</span>
 | 
						|
</span><span id="__span-11-8"><a id="__codelineno-11-8" name="__codelineno-11-8" href="#__codelineno-11-8"></a>        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertNumQueries</span><span class="p">(</span><span class="mi">6</span><span class="p">):</span>
 | 
						|
</span><span id="__span-11-9"><a id="__codelineno-11-9" name="__codelineno-11-9" href="#__codelineno-11-9"></a>            <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">reverse</span><span class="p">(</span><span class="s2">"foo:bar"</span><span class="p">))</span>
 | 
						|
</span></code></pre></div>
 | 
						|
<p>Si l'exécution de la route nécessite plus ou moins de six requêtes,
 | 
						|
alors le test échoue.
 | 
						|
S'il y a eu moins que le nombre de requête attendu, alors tant
 | 
						|
mieux, modifiez le test pour coller au nouveau nombre
 | 
						|
(sous réserve que tous les autres tests passent, bien sûr).
 | 
						|
Si par contre il y a eu plus, alors désolé, vous avez sans doute
 | 
						|
introduit une régression.</p>
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
                
 | 
						|
              </article>
 | 
						|
            </div>
 | 
						|
          
 | 
						|
          
 | 
						|
  <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
 | 
						|
 | 
						|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
 | 
						|
        </div>
 | 
						|
        
 | 
						|
      </main>
 | 
						|
      
 | 
						|
        <footer class="md-footer">
 | 
						|
  
 | 
						|
    
 | 
						|
      
 | 
						|
      <nav class="md-footer__inner md-grid" aria-label="Pied de page" >
 | 
						|
        
 | 
						|
          
 | 
						|
          <a href="../../tutorial/etransaction/" class="md-footer__link md-footer__link--prev" aria-label="Précédent: Etransactions">
 | 
						|
            <div class="md-footer__button md-icon">
 | 
						|
              
 | 
						|
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
 | 
						|
            </div>
 | 
						|
            <div class="md-footer__title">
 | 
						|
              <span class="md-footer__direction">
 | 
						|
                Précédent
 | 
						|
              </span>
 | 
						|
              <div class="md-ellipsis">
 | 
						|
                Etransactions
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
          </a>
 | 
						|
        
 | 
						|
        
 | 
						|
          
 | 
						|
          <a href="../migrations/" class="md-footer__link md-footer__link--next" aria-label="Suivant: Gérer les migrations">
 | 
						|
            <div class="md-footer__title">
 | 
						|
              <span class="md-footer__direction">
 | 
						|
                Suivant
 | 
						|
              </span>
 | 
						|
              <div class="md-ellipsis">
 | 
						|
                Gérer les migrations
 | 
						|
              </div>
 | 
						|
            </div>
 | 
						|
            <div class="md-footer__button md-icon">
 | 
						|
              
 | 
						|
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
 | 
						|
            </div>
 | 
						|
          </a>
 | 
						|
        
 | 
						|
      </nav>
 | 
						|
    
 | 
						|
  
 | 
						|
  <div class="md-footer-meta md-typeset">
 | 
						|
    <div class="md-footer-meta__inner md-grid">
 | 
						|
      <div class="md-copyright">
 | 
						|
  
 | 
						|
  
 | 
						|
    Made with
 | 
						|
    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
 | 
						|
      Material for MkDocs
 | 
						|
    </a>
 | 
						|
  
 | 
						|
</div>
 | 
						|
      
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</footer>
 | 
						|
      
 | 
						|
    </div>
 | 
						|
    <div class="md-dialog" data-md-component="dialog">
 | 
						|
      <div class="md-dialog__inner md-typeset"></div>
 | 
						|
    </div>
 | 
						|
    
 | 
						|
    
 | 
						|
    
 | 
						|
      
 | 
						|
      <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.footer", "content.code.annotate", "content.code.copy", "content.tabs.link"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copi\u00e9 dans le presse-papier", "clipboard.copy": "Copier dans le presse-papier", "search.result.more.one": "1 de plus sur cette page", "search.result.more.other": "# de plus sur cette page", "search.result.none": "Aucun document trouv\u00e9", "search.result.one": "1 document trouv\u00e9", "search.result.other": "# documents trouv\u00e9s", "search.result.placeholder": "Taper pour d\u00e9marrer la recherche", "search.result.term.missing": "Non trouv\u00e9", "select.version": "S\u00e9lectionner la version"}, "version": null}</script>
 | 
						|
    
 | 
						|
    
 | 
						|
      <script src="../../assets/javascripts/bundle.13a4f30d.min.js"></script>
 | 
						|
      
 | 
						|
    
 | 
						|
  </body>
 | 
						|
</html> |