PageSourceSearch

https://www.django-rest-framework.org/tutorial/quickstart/

html django-rest-framework.org collected 2026-09-24 08:51:18 UTC 68,871 bytes, 3,107 lines download raw bytes

1
2<!doctype html>
3<html lang="en" class="no-js">
4  <head>
5    
6      <meta charset="utf-8">
7      <meta name="viewport" content="width=device-width,initial-scale=1">
8      
9        <meta name="description" content="Django REST framework - Web APIs for Django">
10      
11      
12      
13        <link rel="canonical" href="https://www.django-rest-framework.org/tutorial/quickstart/">
14      
15      
16        <link rel="prev" href="../..">
17      
18      
19        <link rel="next" href="../1-serialization/">
20      
21      
22        
23      
24      
25      <link rel="icon" href="../../theme/img/favicon.ico">
26      <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
27    
28    
29      
30        <title>Quickstart - Django REST framework</title>
31      
32    
33    
34      <link rel="stylesheet" href="../../assets/stylesheets/main.ec1eaa64.min.css">
35      
36        
37        <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
38      
39      
40
41
42    
43    
44      
45    
46    
47      
48        
49        
50        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
51        <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">
52        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
53      
54    
55    
56      <link rel="stylesheet" href="../../theme/stylesheets/extra.css">
57    
58      <link rel="stylesheet" href="../../theme/stylesheets/prettify.css">
59    
60    
60<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>
60
61    
62      
63
64    
65    
66  </head>
67  
68  
69    
70    
71      
72    
73    
74    
75    
76    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom">
77  
78    
79    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
80    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
81    <label class="md-overlay" for="__drawer"></label>
82    <div data-md-component="skip">
83      
84        
85        <a href="#quickstart" class="md-skip">
86          Skip to content
87        </a>
88      
89    </div>
90    <div data-md-component="announce">
91      
92    </div>
93    
94    
95      
96
97  
98
99<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
100  <nav class="md-header__inner md-grid" aria-label="Header">
101    <a href="../.." title="Django REST framework" class="md-header__button md-logo" aria-label="Django REST framework" data-md-component="logo">
102      
103  <img src="../../theme/img/logo.png" alt="logo">
104
105    </a>
106    <label class="md-header__button md-icon" for="__drawer">
107      
108      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
109    </label>
110    <div class="md-header__title" data-md-component="header-title">
111      <div class="md-header__ellipsis">
112        <div class="md-header__topic">
113          <span class="md-ellipsis">
114            Django REST framework
115          </span>
116        </div>
117        <div class="md-header__topic" data-md-component="header-topic">
118          <span class="md-ellipsis">
119            
120              Quickstart
121            
122          </span>
123        </div>
124      </div>
125    </div>
126    
127      
128        <form class="md-header__option" data-md-component="palette">
129  
130    
131    
132    
133    <input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom"  aria-label="Switch to light mode"  type="radio" name="__palette" id="__palette_0">
134    
135      <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
136        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
137      </label>
138    
139  
140    
141    
142    
143    <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom"  aria-label="Switch to dark mode"  type="radio" name="__palette" id="__palette_1">
144    
145      <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
146        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
147      </label>
148    
149  
150    
151    
152    
153    <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"  aria-label="Switch to system preference"  type="radio" name="__palette" id="__palette_2">
154    
155      <label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
156        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
157      </label>
158    
159  
160</form>
161      
162    
163    
164      
164<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>
164
165    
166    
167    
168      
169      
170        <label class="md-header__button md-icon" for="__search">
171          
172          <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>
173        </label>
174        <div class="md-search" data-md-component="search" role="dialog">
175  <label class="md-search__overlay" for="__search"></label>
176  <div class="md-search__inner" role="search">
177    <form class="md-search__form" name="search">
178      <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
179      <label class="md-search__icon md-icon" for="__search">
180        
181        <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>
182        
183        <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>
184      </label>
185      <nav class="md-search__options" aria-label="Search">
186        
187        <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
188          
189          <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>
190        </button>
191      </nav>
192      
193        <div class="md-search__suggest" data-md-component="search-suggest"></div>
194      
195    </form>
196    <div class="md-search__output">
197      <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
198        <div class="md-search-result" data-md-component="search-result">
199          <div class="md-search-result__meta">
200            Initializing search
201          </div>
202          <ol class="md-search-result__list" role="presentation"></ol>
203        </div>
204      </div>
205    </div>
206  </div>
207</div>
208      
209    
210    
211      <div class="md-header__source">
212        <a href="https://github.com/encode/django-rest-framework" title="Go to repository" class="md-source" data-md-component="source">
213  <div class="md-source__icon md-icon">
214    
215    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 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 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
216  </div>
217  <div class="md-source__repository">
218    GitHub
219  </div>
220</a>
221      </div>
222    
223  </nav>
224  
225    
226      
227<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
228  <div class="md-grid">
229    <ul class="md-tabs__list">
230      
231        
232  
233  
234  
235  
236    <li class="md-tabs__item">
237      <a href="../.." class="md-tabs__link">
238        
239  
240  
241    
242  
243  Home
244
245      </a>
246    </li>
247  
248
249      
250        
251  
252  
253  
254    
255  
256  
257    
258    
259      <li class="md-tabs__item md-tabs__item--active">
260        <a href="./" class="md-tabs__link">
261          
262  
263  
264  Tutorial
265
266        </a>
267      </li>
268    
269  
270
271      
272        
273  
274  
275  
276  
277    
278    
279      <li class="md-tabs__item">
280        <a href="../../api-guide/requests/" class="md-tabs__link">
281          
282  
283  
284  API Guide
285
286        </a>
287      </li>
288    
289  
290
291      
292        
293  
294  
295  
296  
297    
298    
299      <li class="md-tabs__item">
300        <a href="../../topics/documenting-your-api/" class="md-tabs__link">
301          
302  
303  
304  Topics
305
306        </a>
307      </li>
308    
309  
310
311      
312        
313  
314  
315  
316  
317    
318    
319      <li class="md-tabs__item">
320        <a href="../../community/tutorials-and-resources/" class="md-tabs__link">
321          
322  
323  
324  Community
325
326        </a>
327      </li>
328    
329  
330
331      
332    </ul>
333  </div>
334</nav>
335    
336  
337</header>
338    
339    <div class="md-container" data-md-component="container">
340      
341      
342        
343      
344      <main class="md-main" data-md-component="main">
345        <div class="md-main__inner md-grid">
346          
347            
348              
349              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
350                <div class="md-sidebar__scrollwrap">
351                  <div class="md-sidebar__inner">
352                    
353
354
355  
356
357
358<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
359  <label class="md-nav__title" for="__drawer">
360    <a href="../.." title="Django REST framework" class="md-nav__button md-logo" aria-label="Django REST framework" data-md-component="logo">
361      
362  <img src="../../theme/img/logo.png" alt="logo">
363
364    </a>
365    Django REST framework
366  </label>
367  
368    <div class="md-nav__source">
369      <a href="https://github.com/encode/django-rest-framework" title="Go to repository" class="md-source" data-md-component="source">
370  <div class="md-source__icon md-icon">
371    
372    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 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 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
373  </div>
374  <div class="md-source__repository">
375    GitHub
376  </div>
377</a>
378    </div>
379  
380  <ul class="md-nav__list" data-md-scrollfix>
381    
382      
383      
384  
385  
386  
387  
388    <li class="md-nav__item">
389      <a href="../.." class="md-nav__link">
390        
391  
392  
393  <span class="md-ellipsis">
394    
395  
396    Home
397  
398
399    
400  </span>
401  
402  
403
404      </a>
405    </li>
406  
407
408    
409      
410      
411  
412  
413    
414  
415  
416  
417    
418    
419    
420    
421      
422        
423        
424      
425      
426        
427      
428    
429    
430    <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
431      
432        
433        
434        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
435        
436          
437          <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
438            
439  
440  
441  <span class="md-ellipsis">
442    
443  
444    Tutorial
445  
446
447    
448  </span>
449  
450  
451
452            <span class="md-nav__icon md-icon"></span>
453          </label>
454        
455        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
456          <label class="md-nav__title" for="__nav_2">
457            <span class="md-nav__icon md-icon"></span>
458            
459  
460    Tutorial
461  
462
463          </label>
464          <ul class="md-nav__list" data-md-scrollfix>
465            
466              
467                
468  
469  
470    
471  
472  
473  
474    <li class="md-nav__item md-nav__item--active">
475      
476      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
477      
478      
479        
480      
481      
482        <label class="md-nav__link md-nav__link--active" for="__toc">
483          
484  
485  
486  <span class="md-ellipsis">
487    
488  
489    Quickstart
490  
491
492    
493  </span>
494  
495  
496
497          <span class="md-nav__icon md-icon"></span>
498        </label>
499      
500      <a href="./" class="md-nav__link md-nav__link--active">
501        
502  
503  
504  <span class="md-ellipsis">
505    
506  
507    Quickstart
508  
509
510    
511  </span>
512  
513  
514
515      </a>
516      
517        
518
519<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
520  
521  
522  
523    
524  
525  
526    <label class="md-nav__title" for="__toc">
527      <span class="md-nav__icon md-icon"></span>
528      Table of contents
529    </label>
530    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
531      
532        <li class="md-nav__item">
533  <a href="#project-setup" class="md-nav__link">
534    <span class="md-ellipsis">
535      
536        Project setup
537      
538    </span>
539  </a>
540  
541</li>
542      
543        <li class="md-nav__item">
544  <a href="#serializers" class="md-nav__link">
545    <span class="md-ellipsis">
546      
547        Serializers
548      
549    </span>
550  </a>
551  
552</li>
553      
554        <li class="md-nav__item">
555  <a href="#views" class="md-nav__link">
556    <span class="md-ellipsis">
557      
558        Views
559      
560    </span>
561  </a>
562  
563</li>
564      
565        <li class="md-nav__item">
566  <a href="#urls" class="md-nav__link">
567    <span class="md-ellipsis">
568      
569        URLs
570      
571    </span>
572  </a>
573  
574</li>
575      
576        <li class="md-nav__item">
577  <a href="#pagination" class="md-nav__link">
578    <span class="md-ellipsis">
579      
580        Pagination
581      
582    </span>
583  </a>
584  
585</li>
586      
587        <li class="md-nav__item">
588  <a href="#settings" class="md-nav__link">
589    <span class="md-ellipsis">
590      
591        Settings
592      
593    </span>
594  </a>
595  
596</li>
597      
598        <li class="md-nav__item">
599  <a href="#testing-our-api" class="md-nav__link">
600    <span class="md-ellipsis">
601      
602        Testing our API
603      
604    </span>
605  </a>
606  
607</li>
608      
609    </ul>
610  
611</nav>
612      
613    </li>
614  
615
616              
617            
618              
619                
620  
621  
622  
623  
624    <li class="md-nav__item">
625      <a href="../1-serialization/" class="md-nav__link">
626        
627  
628  
629  <span class="md-ellipsis">
630    
631  
632    1 - Serialization
633  
634
635    
636  </span>
637  
638  
639
640      </a>
641    </li>
642  
643
644              
645            
646              
647                
648  
649  
650  
651  
652    <li class="md-nav__item">
653      <a href="../2-requests-and-responses/" class="md-nav__link">
654        
655  
656  
657  <span class="md-ellipsis">
658    
659  
660    2 - Requests and responses
661  
662
663    
664  </span>
665  
666  
667
668      </a>
669    </li>
670  
671
672              
673            
674              
675                
676  
677  
678  
679  
680    <li class="md-nav__item">
681      <a href="../3-class-based-views/" class="md-nav__link">
682        
683  
684  
685  <span class="md-ellipsis">
686    
687  
688    3 - Class based views
689  
690
691    
692  </span>
693  
694  
695
696      </a>
697    </li>
698  
699
700              
701            
702              
703                
704  
705  
706  
707  
708    <li class="md-nav__item">
709      <a href="../4-authentication-and-permissions/" class="md-nav__link">
710        
711  
712  
713  <span class="md-ellipsis">
714    
715  
716    4 - Authentication and permissions
717  
718
719    
720  </span>
721  
722  
723
724      </a>
725    </li>
726  
727
728              
729            
730              
731                
732  
733  
734  
735  
736    <li class="md-nav__item">
737      <a href="../5-relationships-and-hyperlinked-apis/" class="md-nav__link">
738        
739  
740  
741  <span class="md-ellipsis">
742    
743  
744    5 - Relationships and hyperlinked APIs
745  
746
747    
748  </span>
749  
750  
751
752      </a>
753    </li>
754  
755
756              
757            
758              
759                
760  
761  
762  
763  
764    <li class="md-nav__item">
765      <a href="../6-viewsets-and-routers/" class="md-nav__link">
766        
767  
768  
769  <span class="md-ellipsis">
770    
771  
772    6 - Viewsets and routers
773  
774
775    
776  </span>
777  
778  
779
780      </a>
781    </li>
782  
783
784              
785            
786          </ul>
787        </nav>
788      
789    </li>
790  
791
792    
793      
794      
795  
796  
797  
798  
799    
800    
801    
802    
803      
804      
805        
806      
807    
808    
809    <li class="md-nav__item md-nav__item--nested">
810      
811        
812        
813        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
814        
815          
816          <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
817            
818  
819  
820  <span class="md-ellipsis">
821    
822  
823    API Guide
824  
825
826    
827  </span>
828  
829  
830
831            <span class="md-nav__icon md-icon"></span>
832          </label>
833        
834        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
835          <label class="md-nav__title" for="__nav_3">
836            <span class="md-nav__icon md-icon"></span>
837            
838  
839    API Guide
840  
841
842          </label>
843          <ul class="md-nav__list" data-md-scrollfix>
844            
845              
846                
847  
848  
849  
850  
851    <li class="md-nav__item">
852      <a href="../../api-guide/requests/" class="md-nav__link">
853        
854  
855  
856  <span class="md-ellipsis">
857    
858  
859    Requests
860  
861
862    
863  </span>
864  
865  
866
867      </a>
868    </li>
869  
870
871              
872            
873              
874                
875  
876  
877  
878  
879    <li class="md-nav__item">
880      <a href="../../api-guide/responses/" class="md-nav__link">
881        
882  
883  
884  <span class="md-ellipsis">
885    
886  
887    Responses
888  
889
890    
891  </span>
892  
893  
894
895      </a>
896    </li>
897  
898
899              
900            
901              
902                
903  
904  
905  
906  
907    <li class="md-nav__item">
908      <a href="../../api-guide/views/" class="md-nav__link">
909        
910  
911  
912  <span class="md-ellipsis">
913    
914  
915    Views
916  
917
918    
919  </span>
920  
921  
922
923      </a>
924    </li>
925  
926
927              
928            
929              
930                
931  
932  
933  
934  
935    <li class="md-nav__item">
936      <a href="../../api-guide/generic-views/" class="md-nav__link">
937        
938  
939  
940  <span class="md-ellipsis">
941    
942  
943    Generic views
944  
945
946    
947  </span>
948  
949  
950
951      </a>
952    </li>
953  
954
955              
956            
957              
958                
959  
960  
961  
962  
963    <li class="md-nav__item">
964      <a href="../../api-guide/viewsets/" class="md-nav__link">
965        
966  
967  
968  <span class="md-ellipsis">
969    
970  
971    Viewsets
972  
973
974    
975  </span>
976  
977  
978
979      </a>
980    </li>
981  
982
983              
984            
985              
986                
987  
988  
989  
990  
991    <li class="md-nav__item">
992      <a href="../../api-guide/routers/" class="md-nav__link">
993        
994  
995  
996  <span class="md-ellipsis">
997    
998  
999    Routers
1000  
1001
1002    
1003  </span>
1004  
1005  
1006
1007      </a>
1008    </li>
1009  
1010
1011              
1012            
1013              
1014                
1015  
1016  
1017  
1018  
1019    <li class="md-nav__item">
1020      <a href="../../api-guide/parsers/" class="md-nav__link">
1021        
1022  
1023  
1024  <span class="md-ellipsis">
1025    
1026  
1027    Parsers
1028  
1029
1030    
1031  </span>
1032  
1033  
1034
1035      </a>
1036    </li>
1037  
1038
1039              
1040            
1041              
1042                
1043  
1044  
1045  
1046  
1047    <li class="md-nav__item">
1048      <a href="../../api-guide/renderers/" class="md-nav__link">
1049        
1050  
1051  
1052  <span class="md-ellipsis">
1053    
1054  
1055    Renderers
1056  
1057
1058    
1059  </span>
1060  
1061  
1062
1063      </a>
1064    </li>
1065  
1066
1067              
1068            
1069              
1070                
1071  
1072  
1073  
1074  
1075    <li class="md-nav__item">
1076      <a href="../../api-guide/serializers/" class="md-nav__link">
1077        
1078  
1079  
1080  <span class="md-ellipsis">
1081    
1082  
1083    Serializers
1084  
1085
1086    
1087  </span>
1088  
1089  
1090
1091      </a>
1092    </li>
1093  
1094
1095              
1096            
1097              
1098                
1099  
1100  
1101  
1102  
1103    <li class="md-nav__item">
1104      <a href="../../api-guide/fields/" class="md-nav__link">
1105        
1106  
1107  
1108  <span class="md-ellipsis">
1109    
1110  
1111    Serializer fields
1112  
1113
1114    
1115  </span>
1116  
1117  
1118
1119      </a>
1120    </li>
1121  
1122
1123              
1124            
1125              
1126                
1127  
1128  
1129  
1130  
1131    <li class="md-nav__item">
1132      <a href="../../api-guide/relations/" class="md-nav__link">
1133        
1134  
1135  
1136  <span class="md-ellipsis">
1137    
1138  
1139    Serializer relations
1140  
1141
1142    
1143  </span>
1144  
1145  
1146
1147      </a>
1148    </li>
1149  
1150
1151              
1152            
1153              
1154                
1155  
1156  
1157  
1158  
1159    <li class="md-nav__item">
1160      <a href="../../api-guide/validators/" class="md-nav__link">
1161        
1162  
1163  
1164  <span class="md-ellipsis">
1165    
1166  
1167    Validators
1168  
1169
1170    
1171  </span>
1172  
1173  
1174
1175      </a>
1176    </li>
1177  
1178
1179              
1180            
1181              
1182                
1183  
1184  
1185  
1186  
1187    <li class="md-nav__item">
1188      <a href="../../api-guide/authentication/" class="md-nav__link">
1189        
1190  
1191  
1192  <span class="md-ellipsis">
1193    
1194  
1195    Authentication
1196  
1197
1198    
1199  </span>
1200  
1201  
1202
1203      </a>
1204    </li>
1205  
1206
1207              
1208            
1209              
1210                
1211  
1212  
1213  
1214  
1215    <li class="md-nav__item">
1216      <a href="../../api-guide/permissions/" class="md-nav__link">
1217        
1218  
1219  
1220  <span class="md-ellipsis">
1221    
1222  
1223    Permissions
1224  
1225
1226    
1227  </span>
1228  
1229  
1230
1231      </a>
1232    </li>
1233  
1234
1235              
1236            
1237              
1238                
1239  
1240  
1241  
1242  
1243    <li class="md-nav__item">
1244      <a href="../../api-guide/caching/" class="md-nav__link">
1245        
1246  
1247  
1248  <span class="md-ellipsis">
1249    
1250  
1251    Caching
1252  
1253
1254    
1255  </span>
1256  
1257  
1258
1259      </a>
1260    </li>
1261  
1262
1263              
1264            
1265              
1266                
1267  
1268  
1269  
1270  
1271    <li class="md-nav__item">
1272      <a href="../../api-guide/throttling/" class="md-nav__link">
1273        
1274  
1275  
1276  <span class="md-ellipsis">
1277    
1278  
1279    Throttling
1280  
1281
1282    
1283  </span>
1284  
1285  
1286
1287      </a>
1288    </li>
1289  
1290
1291              
1292            
1293              
1294                
1295  
1296  
1297  
1298  
1299    <li class="md-nav__item">
1300      <a href="../../api-guide/filtering/" class="md-nav__link">
1301        
1302  
1303  
1304  <span class="md-ellipsis">
1305    
1306  
1307    Filtering
1308  
1309
1310    
1311  </span>
1312  
1313  
1314
1315      </a>
1316    </li>
1317  
1318
1319              
1320            
1321              
1322                
1323  
1324  
1325  
1326  
1327    <li class="md-nav__item">
1328      <a href="../../api-guide/pagination/" class="md-nav__link">
1329        
1330  
1331  
1332  <span class="md-ellipsis">
1333    
1334  
1335    Pagination
1336  
1337
1338    
1339  </span>
1340  
1341  
1342
1343      </a>
1344    </li>
1345  
1346
1347              
1348            
1349              
1350                
1351  
1352  
1353  
1354  
1355    <li class="md-nav__item">
1356      <a href="../../api-guide/versioning/" class="md-nav__link">
1357        
1358  
1359  
1360  <span class="md-ellipsis">
1361    
1362  
1363    Versioning
1364  
1365
1366    
1367  </span>
1368  
1369  
1370
1371      </a>
1372    </li>
1373  
1374
1375              
1376            
1377              
1378                
1379  
1380  
1381  
1382  
1383    <li class="md-nav__item">
1384      <a href="../../api-guide/content-negotiation/" class="md-nav__link">
1385        
1386  
1387  
1388  <span class="md-ellipsis">
1389    
1390  
1391    Content negotiation
1392  
1393
1394    
1395  </span>
1396  
1397  
1398
1399      </a>
1400    </li>
1401  
1402
1403              
1404            
1405              
1406                
1407  
1408  
1409  
1410  
1411    <li class="md-nav__item">
1412      <a href="../../api-guide/metadata/" class="md-nav__link">
1413        
1414  
1415  
1416  <span class="md-ellipsis">
1417    
1418  
1419    Metadata
1420  
1421
1422    
1423  </span>
1424  
1425  
1426
1427      </a>
1428    </li>
1429  
1430
1431              
1432            
1433              
1434                
1435  
1436  
1437  
1438  
1439    <li class="md-nav__item">
1440      <a href="../../api-guide/schemas/" class="md-nav__link">
1441        
1442  
1443  
1444  <span class="md-ellipsis">
1445    
1446  
1447    Schemas
1448  
1449
1450    
1451  </span>
1452  
1453  
1454
1455      </a>
1456    </li>
1457  
1458
1459              
1460            
1461              
1462                
1463  
1464  
1465  
1466  
1467    <li class="md-nav__item">
1468      <a href="../../api-guide/format-suffixes/" class="md-nav__link">
1469        
1470  
1471  
1472  <span class="md-ellipsis">
1473    
1474  
1475    Format suffixes
1476  
1477
1478    
1479  </span>
1480  
1481  
1482
1483      </a>
1484    </li>
1485  
1486
1487              
1488            
1489              
1490                
1491  
1492  
1493  
1494  
1495    <li class="md-nav__item">
1496      <a href="../../api-guide/reverse/" class="md-nav__link">
1497        
1498  
1499  
1500  <span class="md-ellipsis">
1501    
1502  
1503    Returning URLs
1504  
1505
1506    
1507  </span>
1508  
1509  
1510
1511      </a>
1512    </li>
1513  
1514
1515              
1516            
1517              
1518                
1519  
1520  
1521  
1522  
1523    <li class="md-nav__item">
1524      <a href="../../api-guide/exceptions/" class="md-nav__link">
1525        
1526  
1527  
1528  <span class="md-ellipsis">
1529    
1530  
1531    Exceptions
1532  
1533
1534    
1535  </span>
1536  
1537  
1538
1539      </a>
1540    </li>
1541  
1542
1543              
1544            
1545              
1546                
1547  
1548  
1549  
1550  
1551    <li class="md-nav__item">
1552      <a href="../../api-guide/status-codes/" class="md-nav__link">
1553        
1554  
1555  
1556  <span class="md-ellipsis">
1557    
1558  
1559    Status codes
1560  
1561
1562    
1563  </span>
1564  
1565  
1566
1567      </a>
1568    </li>
1569  
1570
1571              
1572            
1573              
1574                
1575  
1576  
1577  
1578  
1579    <li class="md-nav__item">
1580      <a href="../../api-guide/testing/" class="md-nav__link">
1581        
1582  
1583  
1584  <span class="md-ellipsis">
1585    
1586  
1587    Testing
1588  
1589
1590    
1591  </span>
1592  
1593  
1594
1595      </a>
1596    </li>
1597  
1598
1599              
1600            
1601              
1602                
1603  
1604  
1605  
1606  
1607    <li class="md-nav__item">
1608      <a href="../../api-guide/settings/" class="md-nav__link">
1609        
1610  
1611  
1612  <span class="md-ellipsis">
1613    
1614  
1615    Settings
1616  
1617
1618    
1619  </span>
1620  
1621  
1622
1623      </a>
1624    </li>
1625  
1626
1627              
1628            
1629          </ul>
1630        </nav>
1631      
1632    </li>
1633  
1634
1635    
1636      
1637      
1638  
1639  
1640  
1641  
1642    
1643    
1644    
1645    
1646      
1647      
1648        
1649      
1650    
1651    
1652    <li class="md-nav__item md-nav__item--nested">
1653      
1654        
1655        
1656        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
1657        
1658          
1659          <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
1660            
1661  
1662  
1663  <span class="md-ellipsis">
1664    
1665  
1666    Topics
1667  
1668
1669    
1670  </span>
1671  
1672  
1673
1674            <span class="md-nav__icon md-icon"></span>
1675          </label>
1676        
1677        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
1678          <label class="md-nav__title" for="__nav_4">
1679            <span class="md-nav__icon md-icon"></span>
1680            
1681  
1682    Topics
1683  
1684
1685          </label>
1686          <ul class="md-nav__list" data-md-scrollfix>
1687            
1688              
1689                
1690  
1691  
1692  
1693  
1694    <li class="md-nav__item">
1695      <a href="../../topics/documenting-your-api/" class="md-nav__link">
1696        
1697  
1698  
1699  <span class="md-ellipsis">
1700    
1701  
1702    Documenting your API
1703  
1704
1705    
1706  </span>
1707  
1708  
1709
1710      </a>
1711    </li>
1712  
1713
1714              
1715            
1716              
1717                
1718  
1719  
1720  
1721  
1722    <li class="md-nav__item">
1723      <a href="../../topics/internationalization/" class="md-nav__link">
1724        
1725  
1726  
1727  <span class="md-ellipsis">
1728    
1729  
1730    Internationalization
1731  
1732
1733    
1734  </span>
1735  
1736  
1737
1738      </a>
1739    </li>
1740  
1741
1742              
1743            
1744              
1745                
1746  
1747  
1748  
1749  
1750    <li class="md-nav__item">
1751      <a href="../../topics/ajax-csrf-cors/" class="md-nav__link">
1752        
1753  
1754  
1755  <span class="md-ellipsis">
1756    
1757  
1758    AJAX, CSRF & CORS
1759  
1760
1761    
1762  </span>
1763  
1764  
1765
1766      </a>
1767    </li>
1768  
1769
1770              
1771            
1772              
1773                
1774  
1775  
1776  
1777  
1778    <li class="md-nav__item">
1779      <a href="../../topics/html-and-forms/" class="md-nav__link">
1780        
1781  
1782  
1783  <span class="md-ellipsis">
1784    
1785  
1786    HTML & Forms
1787  
1788
1789    
1790  </span>
1791  
1792  
1793
1794      </a>
1795    </li>
1796  
1797
1798              
1799            
1800              
1801                
1802  
1803  
1804  
1805  
1806    <li class="md-nav__item">
1807      <a href="../../topics/browser-enhancements/" class="md-nav__link">
1808        
1809  
1810  
1811  <span class="md-ellipsis">
1812    
1813  
1814    Browser Enhancements
1815  
1816
1817    
1818  </span>
1819  
1820  
1821
1822      </a>
1823    </li>
1824  
1825
1826              
1827            
1828              
1829                
1830  
1831  
1832  
1833  
1834    <li class="md-nav__item">
1835      <a href="../../topics/browsable-api/" class="md-nav__link">
1836        
1837  
1838  
1839  <span class="md-ellipsis">
1840    
1841  
1842    The Browsable API
1843  
1844
1845    
1846  </span>
1847  
1848  
1849
1850      </a>
1851    </li>
1852  
1853
1854              
1855            
1856              
1857                
1858  
1859  
1860  
1861  
1862    <li class="md-nav__item">
1863      <a href="../../topics/rest-hypermedia-hateoas/" class="md-nav__link">
1864        
1865  
1866  
1867  <span class="md-ellipsis">
1868    
1869  
1870    REST, Hypermedia & HATEOAS
1871  
1872
1873    
1874  </span>
1875  
1876  
1877
1878      </a>
1879    </li>
1880  
1881
1882              
1883            
1884          </ul>
1885        </nav>
1886      
1887    </li>
1888  
1889
1890    
1891      
1892      
1893  
1894  
1895  
1896  
1897    
1898    
1899    
1900    
1901      
1902      
1903        
1904      
1905    
1906    
1907    <li class="md-nav__item md-nav__item--nested">
1908      
1909        
1910        
1911        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1912        
1913          
1914          <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1915            
1916  
1917  
1918  <span class="md-ellipsis">
1919    
1920  
1921    Community
1922  
1923
1924    
1925  </span>
1926  
1927  
1928
1929            <span class="md-nav__icon md-icon"></span>
1930          </label>
1931        
1932        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1933          <label class="md-nav__title" for="__nav_5">
1934            <span class="md-nav__icon md-icon"></span>
1935            
1936  
1937    Community
1938  
1939
1940          </label>
1941          <ul class="md-nav__list" data-md-scrollfix>
1942            
1943              
1944                
1945  
1946  
1947  
1948  
1949    <li class="md-nav__item">
1950      <a href="../../community/tutorials-and-resources/" class="md-nav__link">
1951        
1952  
1953  
1954  <span class="md-ellipsis">
1955    
1956  
1957    Tutorials and Resources
1958  
1959
1960    
1961  </span>
1962  
1963  
1964
1965      </a>
1966    </li>
1967  
1968
1969              
1970            
1971              
1972                
1973  
1974  
1975  
1976  
1977    <li class="md-nav__item">
1978      <a href="../../community/third-party-packages/" class="md-nav__link">
1979        
1980  
1981  
1982  <span class="md-ellipsis">
1983    
1984  
1985    Third Party Packages
1986  
1987
1988    
1989  </span>
1990  
1991  
1992
1993      </a>
1994    </li>
1995  
1996
1997              
1998            
1999              
2000                
2001  
2002  
2003  
2004  
2005    <li class="md-nav__item">
2006      <a href="../../community/contributing/" class="md-nav__link">
2007        
2008  
2009  
2010  <span class="md-ellipsis">
2011    
2012  
2013    Contributing to REST framework
2014  
2015
2016    
2017  </span>
2018  
2019  
2020
2021      </a>
2022    </li>
2023  
2024
2025              
2026            
2027              
2028                
2029  
2030  
2031  
2032  
2033    <li class="md-nav__item">
2034      <a href="../../community/project-management/" class="md-nav__link">
2035        
2036  
2037  
2038  <span class="md-ellipsis">
2039    
2040  
2041    Project management
2042  
2043
2044    
2045  </span>
2046  
2047  
2048
2049      </a>
2050    </li>
2051  
2052
2053              
2054            
2055              
2056                
2057  
2058  
2059  
2060  
2061    <li class="md-nav__item">
2062      <a href="../../community/release-notes/" class="md-nav__link">
2063        
2064  
2065  
2066  <span class="md-ellipsis">
2067    
2068  
2069    Release Notes
2070  
2071
2072    
2073  </span>
2074  
2075  
2076
2077      </a>
2078    </li>
2079  
2080
2081              
2082            
2083              
2084                
2085  
2086  
2087  
2088  
2089    <li class="md-nav__item">
2090      <a href="../../community/3.16-announcement/" class="md-nav__link">
2091        
2092  
2093  
2094  <span class="md-ellipsis">
2095    
2096  
2097    3.16 Announcement
2098  
2099
2100    
2101  </span>
2102  
2103  
2104
2105      </a>
2106    </li>
2107  
2108
2109              
2110            
2111              
2112                
2113  
2114  
2115  
2116  
2117    <li class="md-nav__item">
2118      <a href="../../community/3.15-announcement/" class="md-nav__link">
2119        
2120  
2121  
2122  <span class="md-ellipsis">
2123    
2124  
2125    3.15 Announcement
2126  
2127
2128    
2129  </span>
2130  
2131  
2132
2133      </a>
2134    </li>
2135  
2136
2137              
2138            
2139              
2140                
2141  
2142  
2143  
2144  
2145    <li class="md-nav__item">
2146      <a href="../../community/3.14-announcement/" class="md-nav__link">
2147        
2148  
2149  
2150  <span class="md-ellipsis">
2151    
2152  
2153    3.14 Announcement
2154  
2155
2156    
2157  </span>
2158  
2159  
2160
2161      </a>
2162    </li>
2163  
2164
2165              
2166            
2167              
2168                
2169  
2170  
2171  
2172  
2173    <li class="md-nav__item">
2174      <a href="../../community/3.13-announcement/" class="md-nav__link">
2175        
2176  
2177  
2178  <span class="md-ellipsis">
2179    
2180  
2181    3.13 Announcement
2182  
2183
2184    
2185  </span>
2186  
2187  
2188
2189      </a>
2190    </li>
2191  
2192
2193              
2194            
2195              
2196                
2197  
2198  
2199  
2200  
2201    <li class="md-nav__item">
2202      <a href="../../community/3.12-announcement/" class="md-nav__link">
2203        
2204  
2205  
2206  <span class="md-ellipsis">
2207    
2208  
2209    3.12 Announcement
2210  
2211
2212    
2213  </span>
2214  
2215  
2216
2217      </a>
2218    </li>
2219  
2220
2221              
2222            
2223              
2224                
2225  
2226  
2227  
2228  
2229    <li class="md-nav__item">
2230      <a href="../../community/3.11-announcement/" class="md-nav__link">
2231        
2232  
2233  
2234  <span class="md-ellipsis">
2235    
2236  
2237    3.11 Announcement
2238  
2239
2240    
2241  </span>
2242  
2243  
2244
2245      </a>
2246    </li>
2247  
2248
2249              
2250            
2251              
2252                
2253  
2254  
2255  
2256  
2257    <li class="md-nav__item">
2258      <a href="../../community/3.10-announcement/" class="md-nav__link">
2259        
2260  
2261  
2262  <span class="md-ellipsis">
2263    
2264  
2265    3.10 Announcement
2266  
2267
2268    
2269  </span>
2270  
2271  
2272
2273      </a>
2274    </li>
2275  
2276
2277              
2278            
2279              
2280                
2281  
2282  
2283  
2284  
2285    <li class="md-nav__item">
2286      <a href="../../community/3.9-announcement/" class="md-nav__link">
2287        
2288  
2289  
2290  <span class="md-ellipsis">
2291    
2292  
2293    3.9 Announcement
2294  
2295
2296    
2297  </span>
2298  
2299  
2300
2301      </a>
2302    </li>
2303  
2304
2305              
2306            
2307              
2308                
2309  
2310  
2311  
2312  
2313    <li class="md-nav__item">
2314      <a href="../../community/3.8-announcement/" class="md-nav__link">
2315        
2316  
2317  
2318  <span class="md-ellipsis">
2319    
2320  
2321    3.8 Announcement
2322  
2323
2324    
2325  </span>
2326  
2327  
2328
2329      </a>
2330    </li>
2331  
2332
2333              
2334            
2335              
2336                
2337  
2338  
2339  
2340  
2341    <li class="md-nav__item">
2342      <a href="../../community/3.7-announcement/" class="md-nav__link">
2343        
2344  
2345  
2346  <span class="md-ellipsis">
2347    
2348  
2349    3.7 Announcement
2350  
2351
2352    
2353  </span>
2354  
2355  
2356
2357      </a>
2358    </li>
2359  
2360
2361              
2362            
2363              
2364                
2365  
2366  
2367  
2368  
2369    <li class="md-nav__item">
2370      <a href="../../community/3.6-announcement/" class="md-nav__link">
2371        
2372  
2373  
2374  <span class="md-ellipsis">
2375    
2376  
2377    3.6 Announcement
2378  
2379
2380    
2381  </span>
2382  
2383  
2384
2385      </a>
2386    </li>
2387  
2388
2389              
2390            
2391              
2392                
2393  
2394  
2395  
2396  
2397    <li class="md-nav__item">
2398      <a href="../../community/3.5-announcement/" class="md-nav__link">
2399        
2400  
2401  
2402  <span class="md-ellipsis">
2403    
2404  
2405    3.5 Announcement
2406  
2407
2408    
2409  </span>
2410  
2411  
2412
2413      </a>
2414    </li>
2415  
2416
2417              
2418            
2419              
2420                
2421  
2422  
2423  
2424  
2425    <li class="md-nav__item">
2426      <a href="../../community/3.4-announcement/" class="md-nav__link">
2427        
2428  
2429  
2430  <span class="md-ellipsis">
2431    
2432  
2433    3.4 Announcement
2434  
2435
2436    
2437  </span>
2438  
2439  
2440
2441      </a>
2442    </li>
2443  
2444
2445              
2446            
2447              
2448                
2449  
2450  
2451  
2452  
2453    <li class="md-nav__item">
2454      <a href="../../community/3.3-announcement/" class="md-nav__link">
2455        
2456  
2457  
2458  <span class="md-ellipsis">
2459    
2460  
2461    3.3 Announcement
2462  
2463
2464    
2465  </span>
2466  
2467  
2468
2469      </a>
2470    </li>
2471  
2472
2473              
2474            
2475              
2476                
2477  
2478  
2479  
2480  
2481    <li class="md-nav__item">
2482      <a href="../../community/3.2-announcement/" class="md-nav__link">
2483        
2484  
2485  
2486  <span class="md-ellipsis">
2487    
2488  
2489    3.2 Announcement
2490  
2491
2492    
2493  </span>
2494  
2495  
2496
2497      </a>
2498    </li>
2499  
2500
2501              
2502            
2503              
2504                
2505  
2506  
2507  
2508  
2509    <li class="md-nav__item">
2510      <a href="../../community/3.1-announcement/" class="md-nav__link">
2511        
2512  
2513  
2514  <span class="md-ellipsis">
2515    
2516  
2517    3.1 Announcement
2518  
2519
2520    
2521  </span>
2522  
2523  
2524
2525      </a>
2526    </li>
2527  
2528
2529              
2530            
2531              
2532                
2533  
2534  
2535  
2536  
2537    <li class="md-nav__item">
2538      <a href="../../community/3.0-announcement/" class="md-nav__link">
2539        
2540  
2541  
2542  <span class="md-ellipsis">
2543    
2544  
2545    3.0 Announcement
2546  
2547
2548    
2549  </span>
2550  
2551  
2552
2553      </a>
2554    </li>
2555  
2556
2557              
2558            
2559              
2560                
2561  
2562  
2563  
2564  
2565    <li class="md-nav__item">
2566      <a href="../../community/kickstarter-announcement/" class="md-nav__link">
2567        
2568  
2569  
2570  <span class="md-ellipsis">
2571    
2572  
2573    Kickstarter Announcement
2574  
2575
2576    
2577  </span>
2578  
2579  
2580
2581      </a>
2582    </li>
2583  
2584
2585              
2586            
2587              
2588                
2589  
2590  
2591  
2592  
2593    <li class="md-nav__item">
2594      <a href="../../community/mozilla-grant/" class="md-nav__link">
2595        
2596  
2597  
2598  <span class="md-ellipsis">
2599    
2600  
2601    Mozilla Grant
2602  
2603
2604    
2605  </span>
2606  
2607  
2608
2609      </a>
2610    </li>
2611  
2612
2613              
2614            
2615              
2616                
2617  
2618  
2619  
2620  
2621    <li class="md-nav__item">
2622      <a href="../../community/jobs/" class="md-nav__link">
2623        
2624  
2625  
2626  <span class="md-ellipsis">
2627    
2628  
2629    Jobs
2630  
2631
2632    
2633  </span>
2634  
2635  
2636
2637      </a>
2638    </li>
2639  
2640
2641              
2642            
2643          </ul>
2644        </nav>
2645      
2646    </li>
2647  
2648
2649    
2650  </ul>
2651</nav>
2652                  </div>
2653                </div>
2654              </div>
2655            
2656            
2657              
2658              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2659                <div class="md-sidebar__scrollwrap">
2660                  <div class="md-sidebar__inner">
2661                    
2662
2663<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2664  
2665  
2666  
2667    
2668  
2669  
2670    <label class="md-nav__title" for="__toc">
2671      <span class="md-nav__icon md-icon"></span>
2672      Table of contents
2673    </label>
2674    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2675      
2676        <li class="md-nav__item">
2677  <a href="#project-setup" class="md-nav__link">
2678    <span class="md-ellipsis">
2679      
2680        Project setup
2681      
2682    </span>
2683  </a>
2684  
2685</li>
2686      
2687        <li class="md-nav__item">
2688  <a href="#serializers" class="md-nav__link">
2689    <span class="md-ellipsis">
2690      
2691        Serializers
2692      
2693    </span>
2694  </a>
2695  
2696</li>
2697      
2698        <li class="md-nav__item">
2699  <a href="#views" class="md-nav__link">
2700    <span class="md-ellipsis">
2701      
2702        Views
2703      
2704    </span>
2705  </a>
2706  
2707</li>
2708      
2709        <li class="md-nav__item">
2710  <a href="#urls" class="md-nav__link">
2711    <span class="md-ellipsis">
2712      
2713        URLs
2714      
2715    </span>
2716  </a>
2717  
2718</li>
2719      
2720        <li class="md-nav__item">
2721  <a href="#pagination" class="md-nav__link">
2722    <span class="md-ellipsis">
2723      
2724        Pagination
2725      
2726    </span>
2727  </a>
2728  
2729</li>
2730      
2731        <li class="md-nav__item">
2732  <a href="#settings" class="md-nav__link">
2733    <span class="md-ellipsis">
2734      
2735        Settings
2736      
2737    </span>
2738  </a>
2739  
2740</li>
2741      
2742        <li class="md-nav__item">
2743  <a href="#testing-our-api" class="md-nav__link">
2744    <span class="md-ellipsis">
2745      
2746        Testing our API
2747      
2748    </span>
2749  </a>
2750  
2751</li>
2752      
2753    </ul>
2754  
2755</nav>
2756                  </div>
2757                </div>
2758              </div>
2759            
2760          
2761          
2762            <div class="md-content" data-md-component="content">
2763              
2764                
2765
2766
2767
2768  
2769
2770
2771  <nav class="md-path" aria-label="Navigation" >
2772    <ol class="md-path__list">
2773      
2774        
2775  
2776  
2777    <li class="md-path__item">
2778      <a href="../.." class="md-path__link">
2779        
2780  <span class="md-ellipsis">
2781    Home
2782  </span>
2783
2784      </a>
2785    </li>
2786  
2787
2788      
2789      
2790        
2791  
2792  
2793    
2794    
2795      <li class="md-path__item">
2796        <a href="./" class="md-path__link">
2797          
2798  <span class="md-ellipsis">
2799    Tutorial
2800  </span>
2801
2802        </a>
2803      </li>
2804    
2805  
2806
2807      
2808    </ol>
2809  </nav>
2810
2811              
2812              <article class="md-content__inner md-typeset">
2813                
2814                  
2815
2816
2817  
2818  
2819
2820
2821<h1 id="quickstart">Quickstart<a class="headerlink" href="#quickstart" title="Permanent link">&para;</a></h1>
2822<p>We're going to create a simple API to allow admin users to view and edit the users and groups in the system.</p>
2823<h2 id="project-setup">Project setup<a class="headerlink" href="#project-setup" title="Permanent link">&para;</a></h2>
2824<p>Create a new Django project named <code>tutorial</code>, then start a new app called <code>quickstart</code>.</p>
2825<div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 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 2025 Fonticons, Inc.--><path d="M220.9 123.3c1 .5 1.8 1.7 3 1.7 1.1 0 2.8-.4 2.9-1.5.2-1.4-1.9-2.3-3.2-2.9-1.7-.7-3.9-1-5.5-.1-.4.2-.8.7-.6 1.1.3 1.3 2.3 1.1 3.4 1.7M199 125c1.2 
28250 2-1.2 3-1.7 1.1-.6 3.1-.4 3.5-1.6.2-.4-.2-.9-.6-1.1-1.6-.9-3.8-.6-5.5.1-1.3.6-3.4 1.5-3.2 2.9.1 1 1.8 1.5 2.8 1.4m221 278.8c-3.6-4-5.3-11.6-7.2-19.7-1.8-8.1-3.9-16.8-10.5-22.4-1.3-1.1-2.6-2.1-4-2.9-1.3-.8-2.7-1.5-4.1-2 9.2-27.3 5.6-54.5-3.7-79.1-11.4-30.1-31.3-56.4-46.5-74.4-17.1-21.5-33.7-41.9-33.4-72C311.1 85.4 315.7.1 234.8 0 132.4-.2 158 103.4 156.9 135.2c-1.7 23.4-6.4 41.8-22.5 64.7-18.9 22.5-45.5 58.8-58.1 96.7-6 17.9-8.8 36.1-6.2 53.3-6.5 5.8-11.4 14.7-16.6 20.2-4.2 4.3-10.3 5.9-17 8.3s-14 6-18.5 14.5c-2.1 3.9-2.8 8.1-2.8 12.4 0 3.9.6 7.9 1.2 11.8 1.2 8.1 2.5 15.7.8 20.8-5.2 14.4-5.9 24.4-2.2 31.7 3.8 7.3 11.4 10.5 20.1 12.3 17.3 3.6 40.8 2.7 59.3 12.5 19.8 10.4 39.9 14.1 55.9 10.4 11.6-2.6 21.1-9.6 25.9-20.2 12.5-.1 26.3-5.4 48.3-6.6 14.9-1.2 33.6 5.3 55.1 4.1.6 2.3 1.4 4.6 2.5 6.7v.1c8.3 16.7 23.8 24.3 40.3 23 16.6-1.3 34.1-11 48.3-27.9 13.6-16.4 36-23.2 50.9-32.2 7.4-4.5 13.4-10.1 13.9-18.3.4-8.2-4.4-17.3-15.5-29.7M223.8 87.3c9.8-22.2 34.2-21.8 44-.4 6.5 14.2 3.6 30.9-4.3 40.4-1.6-.8-5.9-2.6-12.6-4.9 1.1-1.2 3.1-2.7 3.9-4.6 4.8-11.8-.2-27-9.1-27.3-7.3-.5-13.9 10.8-11.8 23-4.1-2-9.4-3.5-13-4.4-1-6.9-.3-14.6 2.9-21.8m-40.7-11.5c10.1 0 20.8 14.2 19.1 33.5-3.5 1-7.1 2.5-10.2 4.6 1.2-8.9-3.3-20.1-9.6-19.6-8.4.7-9.8 21.2-1.8 28.1 1 .8 1.9-.2-5.9 5.5-15.6-14.6-10.5-52.1 8.4-52.1m-13.6 60.7c6.2-4.6 13.6-10 14.1-10.5 4.7-4.4 13.5-14.2 27.9-14.2 7.1 0 15.6 2.3 25.9 8.9 6.3 4.1 11.3 4.4 22.6 9.3 8.4 3.5 13.7 9.7 10.5 18.2-2.6 7.1-11 14.4-22.7 18.1-11.1 3.6-19.8 16-38.2 14.9-3.9-.2-7-1-9.6-2.1-8-3.5-12.2-10.4-20-15-8.6-4.8-13.2-10.4-14.7-15.3q-2.1-7.35 4.2-12.3m3.3 334c-2.7 35.1-43.9 34.4-75.3 18-29.9-15.8-68.6-6.5-76.5-21.9-2.4-4.7-2.4-12.7 2.6-26.4v-.2c2.4-7.6.6-16-.6-23.9-1.2-7.8-1.8-15 .9-20 3.5-6.7 8.5-9.1 14.8-11.3 10.3-3.7 11.8-3.4 19.6-9.9 5.5-5.7 9.5-12.9 14.3-18 5.1-5.5 10-8.1 17.7-6.9 8.1 1.2 15.1 6.8 21.9 16l19.6 35.6c9.5 19.9 43.1 48.4 41 68.9m-1.4-25.9c-4.1-6.6-9.6-13.6-14.4-19.6 7.1 0 14.2-2.2 16.7-8.9 2.3-6.2 0-14.9-7.4-24.9-13.5-18.2-38.3-32.5-38.3-32.5-13.5-8.4-21.1-18.7-24.6-29.9s-3-23.3-.3-35.2c5.2-22.9 18.6-45.2 27.2-59.2 2.3-1.7.8 3.2-8.7 20.8-8.5 16.1-24.4 53.3-2.6 82.4.6-20.7 5.5-41.8 13.8-61.5 12-27.4 37.3-74.9 39.3-112.7 1.1.8 4.6 3.2 6.2 4.1 4.6 2.7 8.1 6.7 12.6 10.3 12.4 10 28.5 9.2 42.4 1.2 6.2-3.5 11.2-7.5 15.9-9 9.9-3.1 17.8-8.6 22.3-15 7.7 30.4 25.7 74.3 37.2 95.7 6.1 11.4 18.3 35.5 23.6 64.6 3.3-.1 7 .4 10.9 1.4 13.8-35.7-11.7-74.2-23.3-84.9-4.7-4.6-4.9-6.6-2.6-6.5 12.6 11.2 29.2 33.7 35.2 59 2.8 11.6 3.3 23.7.4 35.7 16.4 6.8 35.9 17.9 30.7 34.8-2.2-.1-3.2 0-4.2 0 3.2-10.1-3.9-17.6-22.8-26.1-19.6-8.6-36-8.6-38.3 12.5-12.1 4.2-18.3 14.7-21.4 27.3-2.8 11.2-3.6 24.7-4.4 39.9-.5 7.7-3.6 18-6.8 29-32.1 22.9-76.7 32.9-114.3 7.2m257.4-11.5c-.9 16.8-41.2 19.9-63.2 46.5-13.2 15.7-29.4 24.4-43.6 25.5s-26.5-4.8-33.7-19.3c-4.7-11.1-2.4-23.1 1.1-36.3 3.7-14.2 9.2-28.8 9.9-40.6.8-15.2 1.7-28.5 4.2-38.7 2.6-10.3 6.6-17.2 13.7-21.1.3-.2.7-.3 1-.5.8 13.2 7.3 26.6 18.8 29.5 12.6 3.3 30.7-7.5 38.4-16.3 9-.3 15.7-.9 22.6 5.1 9.9 8.5 7.1 30.3 17.1 41.6 10.6 11.6 14 19.5 13.7 24.6M173.4 148.7c2 1.9 4.7 4.5 8 7.1 6.6 5.2 15.8 10.6 27.3 10.6 11.6 0 22.5-5.9 31.8-10.8 4.9-2.6 10.9-7 14.8-10.4s5.9-6.3 3.1-6.6-2.6 2.6-6 5.1c-4.4 3.2-9.7 7.4-13.9 9.8-7.4 4.2-19.5 10.2-29.9 10.2s-18.7-4.8-24.9-9.7c-3.1-2.5-5.7-5-7.7-6.9-1.5-1.4-1.9-4.6-4.3-4.9-1.4-.1-1.8 3.7 1.7 6.5"/></svg></span> Linux, <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 7.1.0 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 2025 Fonticons, Inc.--><path d="M319.1 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7-55.8.9-115.1 44.5-115.1 133.2 0 26.2 4.8 53.3 14.4 81.2 12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9m-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3"/></svg></span> macOS</label><label for="__tabbed_1_2"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 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 2025 Fonticons, Inc.--><path d="m0 93.7 183.6-25.3v177.4H0zm0 324.6 183.6 25.3V268.4H0zm203.8 28L448 480V268.4H203.8zm0-380.6v180.1H448V32z"/></svg></span> Windows</label></div>
2826<div class="tabbed-content">
2827<div class="tabbed-block">
2828<div class="language-bash highlight"><pre><span></span><code><span class="c1"># Create the project directory</span>
2829mkdir<span class="w"> </span>tutorial
2830<span class="nb">cd</span><span class="w"> </span>tutorial
2831
2832<span class="c1"># Create a virtual environment to isolate our package dependencies locally</span>
2833python3<span class="w"> </span>-m<span class="w"> </span>venv<span class="w"> </span>.venv
2834<span class="nb">source</span><span class="w"> </span>.venv/bin/activate
2835
2836<span class="c1"># Install Django and Django REST framework into the virtual environment</span>
2837pip<span class="w"> </span>install<span class="w"> </span>djangorestframework
2838
2839<span class="c1"># Set up a new project with a single application</span>
2840django-admin<span class="w"> </span>startproject<span class="w"> </span>tutorial<span class="w"> </span>.<span class="w">  </span><span class="c1"># Note the trailing '.' character</span>
2841<span class="nb">cd</span><span class="w"> </span>tutorial
2842django-admin<span class="w"> </span>startapp<span class="w"> </span>quickstart
2843<span class="nb">cd</span><span class="w"> </span>..
2844</code></pre></div>
2845</div>
2846<div class="tabbed-block">
2847<p>If you use Bash for Windows</p>
2848<div class="language-bash highlight"><pre><span></span><code><span class="c1"># Create the project directory</span>
2849mkdir<span class="w"> </span>tutorial
2850<span class="nb">cd</span><span class="w"> </span>tutorial
2851
2852<span class="c1"># Create a virtual environment to isolate our package dependencies locally</span>
2853python3<span class="w"> </span>-m<span class="w"> </span>venv<span class="w"> </span>.venv
2854<span class="nb">source</span><span class="w"> </span>.venv<span class="se">\S</span>cripts<span class="se">\a</span>ctivate
2855
2856<span class="c1"># Install Django and Django REST framework into the virtual environment</span>
2857pip<span class="w"> </span>install<span class="w"> </span>djangorestframework
2858
2859<span class="c1"># Set up a new project with a single application</span>
2860django-admin<span class="w"> </span>startproject<span class="w"> </span>tutorial<span class="w"> </span>.<span class="w">  </span><span class="c1"># Note the trailing '.' character</span>
2861<span class="nb">cd</span><span class="w"> </span>tutorial
2862django-admin<span class="w"> </span>startapp<span class="w"> </span>quickstart
2863<span class="nb">cd</span><span class="w"> </span>..
2864</code></pre></div>
2865</div>
2866</div>
2867</div>
2868<p>The project layout should look like:</p>
2869<div class="language-bash highlight"><pre><span></span><code>
2869$<span class="w"> </span><span class="nb">pwd</span>
2870&lt;some<span class="w"> </span>path&gt;/tutorial
2871$<span class="w"> </span>find<span class="w"> </span>.
2872.
2873./tutorial
2874./tutorial/asgi.py
2875./tutorial/__init__.py
2876./tutorial/quickstart
2877./tutorial/quickstart/migrations
2878./tutorial/quickstart/migrations/__init__.py
2879./tutorial/quickstart/models.py
2880./tutorial/quickstart/__init__.py
2881./tutorial/quickstart/apps.py
2882./tutorial/quickstart/admin.py
2883./tutorial/quickstart/tests.py
2884./tutorial/quickstart/views.py
2885./tutorial/settings.py
2886./tutorial/urls.py
2887./tutorial/wsgi.py
2888./env
2889./env/...
2890./manage.py
2891</code></pre></div>
2892<p>It may look unusual that the application has been created within the project directory. Using the project's namespace avoids name clashes with external modules (a topic that goes outside the scope of the quickstart).</p>
2893<p>Now sync your database for the first time:</p>
2894<div class="language-bash highlight"><pre><span></span><code>python<span class="w"> </span>manage.py<span class="w"> </span>migrate
2895</code></pre></div>
2896<p>We'll also create an initial user named <code>admin</code> with a password. We'll authenticate as that user later in our example.</p>
2897<div class="language-bash highlight"><pre><span></span><code>python<span class="w"> </span>manage.py<span class="w"> </span>createsuperuser<span class="w"> </span>--username<span class="w"> </span>admin<span class="w"> </span>--email<span class="w"> </span>[email protected]
2898</code></pre></div>
2899<p>Once you've set up a database and the initial user is created and ready to go, open up the app's directory and we'll get coding...</p>
2900<h2 id="serializers">Serializers<a class="headerlink" href="#serializers" title="Permanent link">&para;</a></h2>
2901<p>First up we're going to define some serializers. Let's create a new module named <code>tutorial/quickstart/serializers.py</code> that we'll use for our data representations.</p>
2902<div class="language-python highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.auth.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Group</span><span class="p">,</span> <span class="n">User</span>
2903<span class="kn">from</span><span class="w"> </span><span class="nn">rest_framework</span><span class="w"> </span><span class="kn">import</span> <span class="n">serializers</span>
2904
2905
2906<span class="k">class</span><span class="w"> </span><span class="nc">UserSerializer</span><span class="p">(</span><span class="n">serializers</span><span class="o">.</span><span class="n">HyperlinkedModelSerializer</span><span class="p">):</span>
2907    <span class="k">class</span><span class="w"> </span><span class="nc">Meta</span><span class="p">:</span>
2908        <span class="n">model</span> <span class="o">=</span> <span class="n">User</span>
2909        <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"url"</span><span class="p">,</span> <span class="s2">"username"</span><span class="p">,</span> <span class="s2">"email"</span><span class="p">,</span> <span class="s2">"groups"</span><span class="p">]</span>
2910
2911
2912<span class="k">class</span><span class="w"> </span><span class="nc">GroupSerializer</span><span class="p">(</span><span class="n">serializers</span><span class="o">.</span><span class="n">HyperlinkedModelSerializer</span><span class="p">):</span>
2913    <span class="k">class</span><span class="w"> </span><span class="nc">Meta</span><span class="p">:</span>
2914        <span class="n">model</span> <span class="o">=</span> <span class="n">Group</span>
2915        <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"url"</span><span class="p">,</span> <span class="s2">"name"</span><span class="p">]</span>
2916</code></pre></div>
2917<p>Notice that we're using hyperlinked relations in this case with <code>HyperlinkedModelSerializer</code>.  You can also use primary key and various other relationships, but hyperlinking is good RESTful design.</p>
2918<h2 id="views">Views<a class="headerlink" href="#views" title="Permanent link">&para;</a></h2>
2919<p>Right, we'd better write some views then.  Open <code>tutorial/quickstart/views.py</code> and get typing.</p>
2920<div class="language-python highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.auth.models</span><span class="w"> </span><span class="kn">
2920import</span> <span class="n">Group</span><span class="p">,</span> <span class="n">User</span>
2921<span class="kn">from</span><span class="w"> </span><span class="nn">rest_framework</span><span class="w"> </span><span class="kn">import</span> <span class="n">permissions</span><span class="p">,</span> <span class="n">viewsets</span>
2922
2923<span class="kn">from</span><span class="w"> </span><span class="nn">tutorial.quickstart.serializers</span><span class="w"> </span><span class="kn">import</span> <span class="n">GroupSerializer</span><span class="p">,</span> <span class="n">UserSerializer</span>
2924
2925
2926<span class="k">class</span><span class="w"> </span><span class="nc">UserViewSet</span><span class="p">(</span><span class="n">viewsets</span><span class="o">.</span><span class="n">ModelViewSet</span><span class="p">):</span>
2927<span class="w">    </span><span class="sd">"""</span>
2928<span class="sd">    API endpoint that allows users to be viewed or edited.</span>
2929<span class="sd">    """</span>
2930
2931    <span class="n">queryset</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">all</span><span class="p">()</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">"-date_joined"</span><span class="p">)</span>
2932    <span class="n">serializer_class</span> <span class="o">=</span> <span class="n">UserSerializer</span>
2933    <span class="n">permission_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">permissions</span><span class="o">.</span><span class="n">IsAuthenticated</span><span class="p">]</span>
2934
2935
2936<span class="k">class</span><span class="w"> </span><span class="nc">GroupViewSet</span><span class="p">(</span><span class="n">viewsets</span><span class="o">.</span><span class="n">ModelViewSet</span><span class="p">):</span>
2937<span class="w">    </span><span class="sd">"""</span>
2938<span class="sd">    API endpoint that allows groups to be viewed or edited.</span>
2939<span class="sd">    """</span>
2940
2941    <span class="n">queryset</span> <span class="o">=</span> <span class="n">Group</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">"name"</span><span class="p">)</span>
2942    <span class="n">serializer_class</span> <span class="o">=</span> <span class="n">GroupSerializer</span>
2943    <span class="n">permission_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">permissions</span><span class="o">.</span><span class="n">IsAuthenticated</span><span class="p">]</span>
2944</code></pre></div>
2945<p>Rather than write multiple views we're grouping together all the common behavior into classes called <code>ViewSets</code>.</p>
2946<p>We can easily break these down into individual views if we need to, but using viewsets keeps the view logic nicely organized as well as being very concise.</p>
2947<h2 id="urls">URLs<a class="headerlink" href="#urls" title="Permanent link">&para;</a></h2>
2948<p>Okay, now let's wire up the API URLs.  On to <code>tutorial/urls.py</code>...</p>
2949<div class="language-python highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">django.urls</span><span class="w"> </span><span class="kn">import</span> <span class="n">include</span><span class="p">,</span> <span class="n">path</span>
2950<span class="kn">from</span><span class="w"> </span><span class="nn">rest_framework</span><span class="w"> </span><span class="kn">import</span> <span class="n">routers</span>
2951
2952<span class="kn">from</span><span class="w"> </span><span class="nn">tutorial.quickstart</span><span class="w"> </span><span class="kn">import</span> <span class="n">views</span>
2953
2954<span class="n">router</span> <span class="o">=</span> <span class="n">routers</span><span class="o">.</span><span class="n">DefaultRouter</span><span class="p">()</span>
2955<span class="n">router</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="sa">r</span><span class="s2">"users"</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">UserViewSet</span><span class="p">)</span>
2956<span class="n">router</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="sa">r</span><span class="s2">"groups"</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">GroupViewSet</span><span class="p">)</span>
2957
2958<span class="c1"># Wire up our API using automatic URL routing.</span>
2959<span class="c1"># Additionally, we include login URLs for the browsable API.</span>
2960<span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">[</span>
2961    <span class="n">path</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="n">router</span><span class="o">.</span><span class="n">urls</span><span class="p">)),</span>
2962    <span class="n">path</span><span class="p">(</span><span class="s2">"api-auth/"</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="s2">"rest_framework.urls"</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="s2">"rest_framework"</span><span class="p">)),</span>
2963<span class="p">]</span>
2964</code></pre></div>
2965<p>Because we're using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class.</p>
2966<p>Again, if we need more control over the API URLs we can simply drop down to using regular class-based views, and writing the URL conf explicitly.</p>
2967<p>Finally, we're including default login and logout views for use with the browsable API.  That's optional, but useful if your API requires authentication and you want to use the browsable API.</p>
2968<h2 id="pagination">Pagination<a class="headerlink" href="#pagination" title="Permanent link">&para;</a></h2>
2969<p>Pagination allows you to control how many objects per page are returned. To enable it add the following lines to <code>tutorial/settings.py</code></p>
2970<div class="language-python highlight"><pre><span></span><code><span class="n">REST_FRAMEWORK</span> <span class="o">=</span> <span class="p">{</span>
2971    <span class="s2">"DEFAULT_PAGINATION_CLASS"</span><span class="p">:</span> <span class="s2">"rest_framework.pagination.PageNumberPagination"</span><span class="p">,</span>
2972    <span class="s2">"PAGE_SIZE"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
2973<span class="p">}</span>
2974</code></pre></div>
2975<h2 id="settings">Settings<a class="headerlink" href="#settings" title="Permanent link">&para;</a></h2>
2976<p>Add <code>'rest_framework'</code> to <code>INSTALLED_APPS</code>. The settings module will be in <code>tutorial/settings.py</code></p>
2977<div class="language-text highlight"><pre><span></span><code>INSTALLED_APPS = [
2978    ...
2979    'rest_framework',
2980]
2981</code></pre></div>
2982<p>Okay, we're done.</p>
2983<hr />
2984<h2 id="testing-our-api">Testing our API<a class="headerlink" href="#testing-our-api" title="Permanent link">&para;</a></h2>
2985<p>We're now ready to test the API we've built.  Let's fire up the server from the command line.</p>
2986<div class="language-bash highlight"><pre><span></span><code>python<span class="w"> </span>manage.py<span class="w"> </span>runserver
2987</code></pre></div>
2988<p>We can now access our API, both from the command-line, using tools like <code>curl</code>...</p>
2989<div class="language-bash highlight"><pre><span></span><code>bash:<span class="w"> </span>curl<span class="w"> </span>-u<span class="w"> </span>admin<span class="w"> </span>-H<span class="w"> </span><span class="s1">'Accept: application/json;
2989 indent=4'</span><span class="w"> </span>http://127.0.0.1:8000/users/
2990Enter<span class="w"> </span>host<span class="w"> </span>password<span class="w"> </span><span class="k">for</span><span class="w"> </span>user<span class="w"> </span><span class="s1">'admin'</span>:
2991<span class="o">{</span>
2992<span class="w">    </span><span class="s2">"count"</span>:<span class="w"> </span><span class="m">1</span>,
2993<span class="w">    </span><span class="s2">"next"</span>:<span class="w"> </span>null,
2994<span class="w">    </span><span class="s2">"previous"</span>:<span class="w"> </span>null,
2995<span class="w">    </span><span class="s2">"results"</span>:<span class="w"> </span><span class="o">[</span>
2996<span class="w">        </span><span class="o">{</span>
2997<span class="w">            </span><span class="s2">"url"</span>:<span class="w"> </span><span class="s2">"http://127.0.0.1:8000/users/1/"</span>,
2998<span class="w">            </span><span class="s2">"username"</span>:<span class="w"> </span><span class="s2">"admin"</span>,
2999<span class="w">            </span><span class="s2">"email"</span>:<span class="w"> </span><span class="s2">"[email protected]"</span>,
3000<span class="w">            </span><span class="s2">"groups"</span>:<span class="w"> </span><span class="o">[]</span>
3001<span class="w">        </span><span class="o">}</span>
3002<span class="w">    </span><span class="o">]</span>
3003<span class="o">}</span>
3004</code></pre></div>
3005<p>Or using the <a href="https://httpie.io/docs#installation">httpie</a>, command line tool...</p>
3006<div class="language-bash highlight"><pre><span></span><code>bash:<span class="w"> </span>http<span class="w"> </span>-a<span class="w"> </span>admin<span class="w"> </span>http://127.0.0.1:8000/users/
3007http:<span class="w"> </span>password<span class="w"> </span><span class="k">for</span><span class="w"> </span>[email protected]:8000::<span class="w"> </span>
3008<span class="nv">$HTTP</span>/1.1<span class="w"> </span><span class="m">200</span><span class="w"> </span>OK
3009...
3010<span class="o">{</span>
3011<span class="w">    </span><span class="s2">"count"</span>:<span class="w"> </span><span class="m">1</span>,
3012<span class="w">    </span><span class="s2">"next"</span>:<span class="w"> </span>null,
3013<span class="w">    </span><span class="s2">"previous"</span>:<span class="w"> </span>null,
3014<span class="w">    </span><span class="s2">"results"</span>:<span class="w"> </span><span class="o">[</span>
3015<span class="w">        </span><span class="o">{</span>
3016<span class="w">            </span><span class="s2">"email"</span>:<span class="w"> </span><span class="s2">"[email protected]"</span>,
3017<span class="w">            </span><span class="s2">"groups"</span>:<span class="w"> </span><span class="o">[]</span>,
3018<span class="w">            </span><span class="s2">"url"</span>:<span class="w"> </span><span class="s2">"http://127.0.0.1:8000/users/1/"</span>,
3019<span class="w">            </span><span class="s2">"username"</span>:<span class="w"> </span><span class="s2">"admin"</span>
3020<span class="w">        </span><span class="o">}</span>
3021<span class="w">    </span><span class="o">]</span>
3022<span class="o">}</span>
3023</code></pre></div>
3024<p>Or directly through the browser, by going to the URL <code>http://127.0.0.1:8000/users/</code>...</p>
3025<p><img alt="Quick start image" src="../../img/quickstart.png" /></p>
3026<p>If you're working through the browser, make sure to login using the control in the top right corner.</p>
3027<p>Great, that was easy!</p>
3028<p>If you want to get a more in depth understanding of how REST framework fits together head on over to <a href="../1-serialization/">the tutorial</a>, or start browsing the <a href="../../api-guide/requests/">API guide</a>.</p>
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041                
3042              </article>
3043            </div>
3044          
3045          
3046  
3046<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>
3046
3047
3048<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
3048
3049        </div>
3050        
3051          <button type="button" class="md-top md-icon" data-md-component="top" hidden>
3052  
3053  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
3054  Back to top
3055</button>
3056        
3057      </main>
3058      
3059        <footer class="md-footer">
3060  
3061  <div class="md-footer-meta md-typeset">
3062    <div class="md-footer-meta__inner md-grid">
3063      <div class="md-copyright">
3064  
3065  
3066    Made with
3067    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
3068      Material for MkDocs
3069    </a>
3070  
3071</div>
3072      
3073    </div>
3074  </div>
3075</footer>
3076      
3077    </div>
3078    <div class="md-dialog" data-md-component="dialog">
3079      <div class="md-dialog__inner md-typeset"></div>
3080    </div>
3081    
3082      <div class="md-progress" data-md-component="progress" role="progressbar"></div>
3083    
3084    
3085    
3086      
3087      
3088      
3088<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["content.tabs.link", "content.code.annotate", "content.code.copy", "navigation.tabs", "navigation.tabs.sticky", "navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.path", "navigation.sections", "navigation.top", "navigation.tracking", "search.suggest", "toc.follow"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
3088
3089    
3090    
3091    
3092      
3092<script src="../../assets/javascripts/bundle.d7400e89.min.js"></script>
3092
3093      
3094        
3094<script src="../../theme/js/prettify-1.0.js"></script>
3094
3095      
3096    
3097    
3097<script>
3098        document$.subscribe(function() {
3099            document.querySelectorAll('pre code').forEach(code => {
3100                code.parentElement.classList.add('prettyprint', 'well');
3101            });
3102            prettyPrint();
3103        });
3104    </script>
3104
3105
3106  </body>
3107</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.