django-rest-framework/api-guide/generic-views.html

256 lines
18 KiB
HTML
Raw Normal View History

2012-09-12 13:14:01 +04:00
<!DOCTYPE html>
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>Django REST framework</title>
2012-10-05 18:26:53 +04:00
<link href="http://tomchristie.github.com/django-rest-framework/img/favicon.ico" rel="icon" type="image/x-icon">
2012-09-12 13:14:01 +04:00
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<!-- Le styles -->
<link href="http://tomchristie.github.com/django-rest-framework/css/prettify.css" rel="stylesheet">
<link href="http://tomchristie.github.com/django-rest-framework/css/bootstrap.css" rel="stylesheet">
<link href="http://tomchristie.github.com/django-rest-framework/css/bootstrap-responsive.css" rel="stylesheet">
2012-09-13 12:40:09 +04:00
<link href="http://tomchristie.github.com/django-rest-framework/css/default.css" rel="stylesheet">
2012-09-12 13:14:01 +04:00
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
2012-10-01 19:27:59 +04:00
<body onload="prettyPrint()" class="generic-views-page">
2012-09-12 13:14:01 +04:00
2012-10-05 22:27:27 +04:00
<div class="wrapper">
2012-09-12 13:14:01 +04:00
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
2012-09-12 16:12:00 +04:00
<a class="repo-link btn btn-primary btn-small" href="https://github.com/tomchristie/django-rest-framework/tree/restframework2">GitHub</a>
2012-09-12 13:14:01 +04:00
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="http://tomchristie.github.com/django-rest-framework">Django REST framework</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li><a href="http://tomchristie.github.com/django-rest-framework">Home</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Tutorial <b class="caret"></b></a>
<ul class="dropdown-menu">
2012-10-09 15:01:56 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/tutorial/quickstart">Quickstart</a></li>
2012-09-12 13:14:01 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/tutorial/1-serialization">1 - Serialization</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/tutorial/2-requests-and-responses">2 - Requests and responses</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/tutorial/3-class-based-views">3 - Class based views</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/tutorial/4-authentication-permissions-and-throttling">4 - Authentication, permissions and throttling</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/tutorial/5-relationships-and-hyperlinked-apis">5 - Relationships and hyperlinked APIs</a></li>
<!-- <li><a href="http://tomchristie.github.com/django-rest-framework/tutorial/6-resource-orientated-projects">6 - Resource orientated projects</a></li> -->
2012-09-12 13:14:01 +04:00
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">API Guide <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/requests">Requests</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/responses">Responses</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/views">Views</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/generic-views">Generic views</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/parsers">Parsers</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/renderers">Renderers</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/serializers">Serializers</a></li>
2012-10-05 20:10:33 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/fields">Serializer fields</a></li>
2012-09-12 13:14:01 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/authentication">Authentication</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/permissions">Permissions</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/throttling">Throttling</a></li>
2012-10-01 19:27:59 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/pagination">Pagination</a></li>
2012-09-12 13:14:01 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/content-negotiation">Content negotiation</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/format-suffixes">Format suffixes</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/reverse">Returning URLs</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/exceptions">Exceptions</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/status-codes">Status codes</a></li>
<li><a href="http://tomchristie.github.com/django-rest-framework/api-guide/settings">Settings</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Topics <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/csrf">Working with AJAX and CSRF</a></li>
2012-10-13 18:09:05 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/browser-enhancements">Browser enhancements</a></li>
2012-10-13 18:35:46 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/browsable-api">The Browsable API</a></li>
2012-10-08 15:19:26 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/rest-hypermedia-hateoas">REST, Hypermedia & HATEOAS</a></li>
2012-09-12 13:14:01 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/contributing">Contributing to REST framework</a></li>
2012-10-08 15:19:26 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/migration">2.0 Migration Guide</a></li>
2012-10-17 16:50:08 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/release-notes">Release Notes</a></li>
2012-09-12 13:14:01 +04:00
<li><a href="http://tomchristie.github.com/django-rest-framework/topics/credits">Credits</a></li>
</ul>
</li>
</ul>
<ul class="nav pull-right">
2012-10-09 17:13:19 +04:00
<!-- TODO
2012-09-12 13:14:01 +04:00
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Version: 2.0.0 <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="#">Trunk</a></li>
<li><a href="#">2.0.0</a></li>
</ul>
</li>
2012-10-09 17:13:19 +04:00
-->
2012-09-12 13:14:01 +04:00
</ul>
</div><!--/.nav-collapse -->
</div>
</div>
</div>
2012-10-05 22:27:27 +04:00
<div class="body-content">
<div class="container-fluid">
<div class="row-fluid">
2012-10-05 16:22:18 +04:00
2012-10-05 22:27:27 +04:00
<div class="span3">
2012-10-08 15:19:26 +04:00
<!-- TODO
<p style="margin-top: -12px">
<a class="btn btn-mini btn-primary" style="width: 60px">&laquo; previous</a>
<a class="btn btn-mini btn-primary" style="float: right; margin-right: 8px; width: 60px;">next &raquo;</a>
</p>
-->
2012-10-05 22:27:27 +04:00
<div id="table-of-contents">
<ul class="nav nav-list side-nav well sidebar-nav-fixed">
<li class="main"><a href="#generic-views">Generic views</a></li>
2012-10-05 01:32:43 +04:00
<li><a href="#examples">Examples</a></li>
2012-10-02 14:48:45 +04:00
<li class="main"><a href="#api-reference">API Reference</a></li>
<li><a href="#listapiview">ListAPIView</a></li>
<li><a href="#listcreateapiview">ListCreateAPIView</a></li>
<li><a href="#retrieveapiview">RetrieveAPIView</a></li>
<li><a href="#retrievedestroyapiview">RetrieveDestroyAPIView</a></li>
2012-10-02 14:48:45 +04:00
<li><a href="#retrieveupdatedestroyapiview">RetrieveUpdateDestroyAPIView</a></li>
<li class="main"><a href="#base-views">Base views</a></li>
<li><a href="#baseapiview">BaseAPIView</a></li>
<li><a href="#multipleobjectbaseapiview">MultipleObjectBaseAPIView</a></li>
<li><a href="#singleobjectbaseapiview">SingleObjectBaseAPIView</a></li>
<li class="main"><a href="#mixins">Mixins</a></li>
<li><a href="#listmodelmixin">ListModelMixin</a></li>
<li><a href="#createmodelmixin">CreateModelMixin</a></li>
<li><a href="#retrievemodelmixin">RetrieveModelMixin</a></li>
<li><a href="#updatemodelmixin">UpdateModelMixin</a></li>
<li><a href="#destroymodelmixin">DestroyModelMixin</a></li>
2012-09-12 13:14:01 +04:00
2012-10-05 22:27:27 +04:00
</ul>
</div>
2012-09-12 13:14:01 +04:00
</div>
2012-10-05 22:27:27 +04:00
<div id="main-content" class="span9">
<p><a class="github" href="https://github.com/tomchristie/django-rest-framework/blob/restframework2/rest_framework/mixins.py"><span class="label label-info">mixins.py</span></a>
<a class="github" href="https://github.com/tomchristie/django-rest-framework/blob/restframework2/rest_framework/generics.py"><span class="label label-info">generics.py</span></a></p>
2012-09-12 13:14:01 +04:00
<h1 id="generic-views">Generic views</h1>
<blockquote>
<p>Djangos generic views... were developed as a shortcut for common usage patterns... They take certain common idioms and patterns found in view development and abstract them so that you can quickly write common views of data without having to repeat yourself.</p>
<p>&mdash; <a href="https://docs.djangoproject.com/en/dev/ref/class-based-views/#base-vs-generic-views">Django Documentation</a></p>
</blockquote>
2012-10-02 14:48:45 +04:00
<p>One of the key benefits of class based views is the way they allow you to compose bits of reusable behaviour. REST framework takes advantage of this by providing a number of pre-built views that provide for commonly used patterns. </p>
2012-10-05 01:32:43 +04:00
<p>The generic views provided by REST framework allow you to quickly build API views that map closely to your database models.</p>
<p>If the generic views don't suit the needs of your API, you can drop down to using the regular <code>APIView</code> class, or reuse the mixins and base classes used by the generic views to compose your own set of reusable generic views. </p>
<h2 id="examples">Examples</h2>
<p>Typically when using the generic views, you'll override the view, and set several class attributes.</p>
<pre class="prettyprint lang-py"><code>class UserList(generics.ListCreateAPIView):
model = User
2012-10-05 16:22:18 +04:00
serializer_class = UserSerializer
permission_classes = (IsAdminUser,)
2012-10-05 01:32:43 +04:00
paginate_by = 100
</code></pre>
<p>For more complex cases you might also want to override various methods on the view class. For example.</p>
<pre class="prettyprint lang-py"><code>class UserList(generics.ListCreateAPIView):
model = User
2012-10-05 16:22:18 +04:00
serializer_class = UserSerializer
permission_classes = (IsAdminUser,)
2012-10-05 01:32:43 +04:00
def get_paginate_by(self):
"""
Use smaller pagination for HTML representations.
"""
2012-10-05 16:22:18 +04:00
page_size_param = self.request.QUERY_PARAMS.get('page_size')
if page_size_param:
return int(page_size_param)
2012-10-05 01:32:43 +04:00
return 100
</code></pre>
<p>For very simple cases you might want to pass through any class attributes using the <code>.as_view()</code> method. For example, your URLconf might include something the following entry.</p>
<pre class="prettyprint lang-py"><code>url(r'^/users/', ListCreateAPIView.as_view(model=User) name='user-list')
</code></pre>
2012-10-02 14:48:45 +04:00
<hr />
<h1 id="api-reference">API Reference</h1>
<p>The following classes are the concrete generic views. If you're using generic views this is normally the level you'll be working at unless you need heavily customized behavior.</p>
2012-10-02 14:48:45 +04:00
<h2 id="listapiview">ListAPIView</h2>
<p>Used for <strong>read-only</strong> endpoints to represent a <strong>collection of model instances</strong>.</p>
2012-10-02 14:48:45 +04:00
<p>Provides a <code>get</code> method handler.</p>
2012-10-05 16:22:18 +04:00
<p>Extends: <a href="#multipleobjectbaseapiview">MultipleObjectBaseAPIView</a>, <a href="#listmodelmixin">ListModelMixin</a></p>
2012-10-02 14:48:45 +04:00
<h2 id="listcreateapiview">ListCreateAPIView</h2>
<p>Used for <strong>read-write</strong> endpoints to represent a <strong>collection of model instances</strong>.</p>
2012-10-02 14:48:45 +04:00
<p>Provides <code>get</code> and <code>post</code> method handlers.</p>
2012-10-05 16:22:18 +04:00
<p>Extends: <a href="#multipleobjectbaseapiview">MultipleObjectBaseAPIView</a>, <a href="#listmodelmixin">ListModelMixin</a>, <a href="#createmodelmixin">CreateModelMixin</a></p>
2012-10-02 14:48:45 +04:00
<h2 id="retrieveapiview">RetrieveAPIView</h2>
<p>Used for <strong>read-only</strong> endpoints to represent a <strong>single model instance</strong>.</p>
2012-10-02 14:48:45 +04:00
<p>Provides a <code>get</code> method handler.</p>
2012-10-05 16:22:18 +04:00
<p>Extends: <a href="#singleobjectbaseapiview">SingleObjectBaseAPIView</a>, <a href="#retrievemodelmixin">RetrieveModelMixin</a></p>
<h2 id="retrievedestroyapiview">RetrieveDestroyAPIView</h2>
<p>Used for <strong>read or delete</strong> endpoints to represent a <strong>single model instance</strong>.</p>
<p>Provides <code>get</code> and <code>delete</code> method handlers.</p>
<p>Extends: <a href="#singleobjectbaseapiview">SingleObjectBaseAPIView</a>, <a href="#retrievemodelmixin">RetrieveModelMixin</a>, <a href="#destroymodelmixin">DestroyModelMixin</a></p>
2012-10-02 14:48:45 +04:00
<h2 id="retrieveupdatedestroyapiview">RetrieveUpdateDestroyAPIView</h2>
<p>Used for <strong>read-write</strong> endpoints to represent a <strong>single model instance</strong>.</p>
2012-10-02 14:48:45 +04:00
<p>Provides <code>get</code>, <code>put</code> and <code>delete</code> method handlers.</p>
2012-10-05 16:22:18 +04:00
<p>Extends: <a href="#singleobjectbaseapiview">SingleObjectBaseAPIView</a>, <a href="#retrievemodelmixin">RetrieveModelMixin</a>, <a href="#updatemodelmixin">UpdateModelMixin</a>, <a href="#destroymodelmixin">DestroyModelMixin</a></p>
2012-10-02 14:48:45 +04:00
<hr />
<h1 id="base-views">Base views</h1>
2012-10-05 01:32:43 +04:00
<p>Each of the generic views provided is built by combining one of the base views below, with one or more mixin classes.</p>
2012-10-02 14:48:45 +04:00
<h2 id="baseapiview">BaseAPIView</h2>
<p>Extends REST framework's <code>APIView</code> class, adding support for serialization of model instances and model querysets.</p>
<h2 id="multipleobjectbaseapiview">MultipleObjectBaseAPIView</h2>
<p>Provides a base view for acting on a single object, by combining REST framework's <code>APIView</code>, and Django's <a href="https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-multiple-object/">MultipleObjectMixin</a>.</p>
<p><strong>See also:</strong> ccbv.co.uk documentation for <a href="http://ccbv.co.uk/projects/Django/1.4/django.views.generic.list/MultipleObjectMixin/">MultipleObjectMixin</a>.</p>
<h2 id="singleobjectbaseapiview">SingleObjectBaseAPIView</h2>
<p>Provides a base view for acting on a single object, by combining REST framework's <code>APIView</code>, and Django's <a href="https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-single-object/">SingleObjectMixin</a>.</p>
<p><strong>See also:</strong> ccbv.co.uk documentation for <a href="http://ccbv.co.uk/projects/Django/1.4/django.views.generic.detail/SingleObjectMixin/">SingleObjectMixin</a>.</p>
<hr />
<h1 id="mixins">Mixins</h1>
2012-10-05 01:32:43 +04:00
<p>The mixin classes provide the actions that are used to provide the basic view behaviour. Note that the mixin classes provide action methods rather than defining the handler methods such as <code>.get()</code> and <code>.post()</code> directly. This allows for more flexible composition of behaviour. </p>
2012-10-02 14:48:45 +04:00
<h2 id="listmodelmixin">ListModelMixin</h2>
<p>Provides a <code>.list(request, *args, **kwargs)</code> method, that implements listing a queryset.</p>
<p>Should be mixed in with <a href="#multipleobjectbaseapiview">MultipleObjectBaseAPIView</a>.</p>
2012-10-02 14:48:45 +04:00
<h2 id="createmodelmixin">CreateModelMixin</h2>
<p>Provides a <code>.create(request, *args, **kwargs)</code> method, that implements creating and saving a new model instance.</p>
<p>Should be mixed in with any <a href="#baseapiview">BaseAPIView</a>.</p>
2012-10-02 14:48:45 +04:00
<h2 id="retrievemodelmixin">RetrieveModelMixin</h2>
<p>Provides a <code>.retrieve(request, *args, **kwargs)</code> method, that implements returning an existing model instance in a response.</p>
<p>Should be mixed in with <a href="#singleobjectbaseapiview">SingleObjectBaseAPIView</a>.</p>
2012-10-02 14:48:45 +04:00
<h2 id="updatemodelmixin">UpdateModelMixin</h2>
<p>Provides a <code>.update(request, *args, **kwargs)</code> method, that implements updating and saving an existing model instance.</p>
<p>Should be mixed in with <a href="#singleobjectbaseapiview">SingleObjectBaseAPIView</a>.</p>
2012-10-02 14:48:45 +04:00
<h2 id="destroymodelmixin">DestroyModelMixin</h2>
<p>Provides a <code>.destroy(request, *args, **kwargs)</code> method, that implements deletion of an existing model instance.</p>
<p>Should be mixed in with <a href="#singleobjectbaseapiview">SingleObjectBaseAPIView</a>.</p>
2012-10-05 22:27:27 +04:00
</div><!--/span-->
</div><!--/row-->
</div><!--/.fluid-container-->
</div><!--/.body content-->
2012-09-12 13:14:01 +04:00
2012-10-05 18:26:53 +04:00
<div id="push"></div>
2012-10-05 22:27:27 +04:00
</div><!--/.wrapper -->
2012-10-05 18:26:53 +04:00
2012-10-05 22:27:27 +04:00
<footer class="span12">
2012-10-05 22:33:52 +04:00
<p>Sponsored by <a href="http://dabapps.com/">DabApps</a>.</a></p>
2012-10-05 22:27:27 +04:00
</footer>
2012-10-05 18:26:53 +04:00
2012-09-12 13:14:01 +04:00
<!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="http://tomchristie.github.com/django-rest-framework/js/jquery-1.8.1-min.js"></script>
2012-10-05 16:22:18 +04:00
<script src="http://tomchristie.github.com/django-rest-framework/js/prettify-1.0.js"></script>
<script src="http://tomchristie.github.com/django-rest-framework/js/bootstrap-2.1.1-min.js"></script>
2012-09-12 13:14:01 +04:00
<script>
//$('.side-nav').scrollspy()
var shiftWindow = function() { scrollBy(0, -50) };
if (location.hash) shiftWindow();
window.addEventListener("hashchange", shiftWindow);
2012-09-17 23:21:26 +04:00
$('.dropdown-menu').on('click touchstart', function(event) {
2012-09-12 13:14:01 +04:00
event.stopPropagation();
});
</script>
2012-10-01 19:27:59 +04:00
</body></html>