aboutsummaryrefslogtreecommitdiffstats
path: root/docs/api-guide
diff options
context:
space:
mode:
Diffstat (limited to 'docs/api-guide')
-rwxr-xr-xdocs/api-guide/authentication.md6
-rw-r--r--docs/api-guide/exceptions.md2
-rw-r--r--docs/api-guide/fields.md4
-rw-r--r--docs/api-guide/filtering.md43
-rwxr-xr-xdocs/api-guide/generic-views.md25
-rw-r--r--docs/api-guide/renderers.md7
-rw-r--r--docs/api-guide/testing.md4
7 files changed, 80 insertions, 11 deletions
diff --git a/docs/api-guide/authentication.md b/docs/api-guide/authentication.md
index 7caeac1e..1a1c68b8 100755
--- a/docs/api-guide/authentication.md
+++ b/docs/api-guide/authentication.md
@@ -265,6 +265,12 @@ This authentication class depends on the optional [django-oauth2-provider][djang
'provider.oauth2',
)
+Then add `OAuth2Authentication` to your global `DEFAULT_AUTHENTICATION` setting:
+
+ 'DEFAULT_AUTHENTICATION_CLASSES': (
+ 'rest_framework.authentication.OAuth2Authentication',
+ ),
+
You must also include the following in your root `urls.py` module:
url(r'^oauth2/', include('provider.oauth2.urls', namespace='oauth2')),
diff --git a/docs/api-guide/exceptions.md b/docs/api-guide/exceptions.md
index 0c48783a..c46d415e 100644
--- a/docs/api-guide/exceptions.md
+++ b/docs/api-guide/exceptions.md
@@ -82,7 +82,7 @@ Note that the exception handler will only be called for responses generated by r
## APIException
-**Signature:** `APIException(detail=None)`
+**Signature:** `APIException()`
The **base class** for all exceptions raised inside REST framework.
diff --git a/docs/api-guide/fields.md b/docs/api-guide/fields.md
index 962c49e2..4272c9a7 100644
--- a/docs/api-guide/fields.md
+++ b/docs/api-guide/fields.md
@@ -299,9 +299,9 @@ Django's regular [FILE_UPLOAD_HANDLERS] are used for handling uploaded files.
# Custom fields
-If you want to create a custom field, you'll probably want to override either one or both of the `.to_native()` and `.from_native()` methods. These two methods are used to convert between the initial datatype, and a primative, serializable datatype. Primative datatypes may be any of a number, string, date/time/datetime or None. They may also be any list or dictionary like object that only contains other primative objects.
+If you want to create a custom field, you'll probably want to override either one or both of the `.to_native()` and `.from_native()` methods. These two methods are used to convert between the initial datatype, and a primitive, serializable datatype. Primitive datatypes may be any of a number, string, date/time/datetime or None. They may also be any list or dictionary like object that only contains other primitive objects.
-The `.to_native()` method is called to convert the initial datatype into a primative, serializable datatype. The `from_native()` method is called to restore a primative datatype into it's initial representation.
+The `.to_native()` method is called to convert the initial datatype into a primitive, serializable datatype. The `from_native()` method is called to restore a primitive datatype into it's initial representation.
## Examples
diff --git a/docs/api-guide/filtering.md b/docs/api-guide/filtering.md
index 784aa585..a0132ffc 100644
--- a/docs/api-guide/filtering.md
+++ b/docs/api-guide/filtering.md
@@ -165,8 +165,8 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha
from rest_framework import generics
class ProductFilter(django_filters.FilterSet):
- min_price = django_filters.NumberFilter(lookup_type='gte')
- max_price = django_filters.NumberFilter(lookup_type='lte')
+ min_price = django_filters.NumberFilter(name="price", lookup_type='gte')
+ max_price = django_filters.NumberFilter(name="price", lookup_type='lte')
class Meta:
model = Product
fields = ['category', 'in_stock', 'min_price', 'max_price']
@@ -176,10 +176,49 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha
serializer_class = ProductSerializer
filter_class = ProductFilter
+
Which will allow you to make requests such as:
http://example.com/api/products?category=clothing&max_price=10.00
+You can also span relationships using `django-filter`, let's assume that each
+product has foreign key to `Manufacturer` model, so we create filter that
+filters using `Manufacturer` name. For example:
+
+ import django_filters
+ from myapp.models import Product
+ from myapp.serializers import ProductSerializer
+ from rest_framework import generics
+
+ class ProductFilter(django_filters.FilterSet):
+ class Meta:
+ model = Product
+ fields = ['category', 'in_stock', 'manufacturer__name`]
+
+This enables us to make queries like:
+
+ http://example.com/api/products?manufacturer__name=foo
+
+This is nice, but it shows underlying model structure in REST API, which may
+be undesired, but you can use:
+
+ import django_filters
+ from myapp.models import Product
+ from myapp.serializers import ProductSerializer
+ from rest_framework import generics
+
+ class ProductFilter(django_filters.FilterSet):
+
+ manufacturer = django_filters.CharFilter(name="manufacturer__name")
+
+ class Meta:
+ model = Product
+ fields = ['category', 'in_stock', 'manufacturer`]
+
+And now you can execute:
+
+ http://example.com/api/products?manufacturer=foo
+
For more details on using filter sets see the [django-filter documentation][django-filter-docs].
---
diff --git a/docs/api-guide/generic-views.md b/docs/api-guide/generic-views.md
index dc0076df..b9242724 100755
--- a/docs/api-guide/generic-views.md
+++ b/docs/api-guide/generic-views.md
@@ -65,7 +65,8 @@ The following attributes control the basic view behavior.
* `queryset` - The queryset that should be used for returning objects from this view. Typically, you must either set this attribute, or override the `get_queryset()` method.
* `serializer_class` - The serializer class that should be used for validating and deserializing input, and for serializing output. Typically, you must either set this attribute, or override the `get_serializer_class()` method.
-* `lookup_field` - The field that should be used to lookup individual model instances. Defaults to `'pk'`. The URL conf should include a keyword argument corresponding to this value. More complex lookup styles can be supported by overriding the `get_object()` method. Note that when using hyperlinked APIs you'll need to ensure that *both* the API views *and* the serializer classes use lookup fields that correctly correspond with the URL conf.
+* `lookup_field` - The model field that should be used to for performing object lookup of individual model instances. Defaults to `'pk'`. Note that when using hyperlinked APIs you'll need to ensure that *both* the API views *and* the serializer classes set the lookup fields if you need to use a custom value.
+* `lookup_url_kwarg` - The URL keyword argument that should be used for object lookup. The URL conf should include a keyword argument corresponding to this value. If unset this defaults to using the same value as `lookup_field`.
**Shortcuts**:
@@ -120,11 +121,27 @@ For example:
Note that if your API doesn't include any object level permissions, you may optionally exclude the ``self.check_object_permissions, and simply return the object from the `get_object_or_404` lookup.
+#### `get_filter_backends(self)`
+
+Returns the classes that should be used to filter the queryset. Defaults to returning the `filter_backends` attribute.
+
+May be override to provide more complex behavior with filters, as using different (or even exlusive) lists of filter_backends depending on different criteria.
+
+For example:
+
+ def get_filter_backends(self):
+ if "geo_route" in self.request.QUERY_PARAMS:
+ return (GeoRouteFilter, CategoryFilter)
+ elif "geo_point" in self.request.QUERY_PARAMS:
+ return (GeoPointFilter, CategoryFilter)
+
+ return (CategoryFilter,)
+
#### `get_serializer_class(self)`
Returns the class that should be used for the serializer. Defaults to returning the `serializer_class` attribute, or dynamically generating a serializer class if the `model` shortcut is being used.
-May be override to provide dynamic behavior such as using different serializers for read and write operations, or providing different serializers to different types of uesr.
+May be override to provide dynamic behavior such as using different serializers for read and write operations, or providing different serializers to different types of users.
For example:
@@ -327,7 +344,7 @@ You can then simply apply this mixin to a view or viewset anytime you need to ap
serializer_class = UserSerializer
lookup_fields = ('account', 'username')
-Using custom mixins is a good option if you have custom behavior that needs to be used
+Using custom mixins is a good option if you have custom behavior that needs to be used
## Creating custom base classes
@@ -336,7 +353,7 @@ If you are using a mixin across multiple views, you can take this a step further
class BaseRetrieveView(MultipleFieldLookupMixin,
generics.RetrieveAPIView):
pass
-
+
class BaseRetrieveUpdateDestroyView(MultipleFieldLookupMixin,
generics.RetrieveUpdateDestroyAPIView):
pass
diff --git a/docs/api-guide/renderers.md b/docs/api-guide/renderers.md
index 657377d9..1f286ef1 100644
--- a/docs/api-guide/renderers.md
+++ b/docs/api-guide/renderers.md
@@ -409,6 +409,10 @@ The following third party packages are also available.
Comma-separated values are a plain-text tabular data format, that can be easily imported into spreadsheet applications. [Mjumbe Poe][mjumbewu] maintains the [djangorestframework-csv][djangorestframework-csv] package which provides CSV renderer support for REST framework.
+## UltraJSON
+
+[UltraJSON][ultrajson] is a blazing-fast C JSON encoder which can give 2-10x performance increases on typical workloads. [Jacob Haslehurst][hzy] maintains the [drf-ujson-renderer][drf-ujson-renderer] package which implements JSON rendering using the UJSON package.
+
[cite]: https://docs.djangoproject.com/en/dev/ref/template-response/#the-rendering-process
[conneg]: content-negotiation.md
[browser-accept-headers]: http://www.gethifi.com/blog/browser-rest-http-accept-headers
@@ -426,3 +430,6 @@ Comma-separated values are a plain-text tabular data format, that can be easily
[mjumbewu]: https://github.com/mjumbewu
[djangorestframework-msgpack]: https://github.com/juanriaza/django-rest-framework-msgpack
[djangorestframework-csv]: https://github.com/mjumbewu/django-rest-framework-csv
+[ultrajson]: https://github.com/esnme/ultrajson
+[hzy]: https://github.com/hzy
+[drf-ujson-renderer]: https://github.com/gizmag/drf-ujson-renderer
diff --git a/docs/api-guide/testing.md b/docs/api-guide/testing.md
index 35c1f766..4a8a9168 100644
--- a/docs/api-guide/testing.md
+++ b/docs/api-guide/testing.md
@@ -205,10 +205,10 @@ You can use any of REST framework's test case classes as you would for the regul
Ensure we can create a new account object.
"""
url = reverse('account-list')
- expected = {'name': 'DabApps'}
+ data = {'name': 'DabApps'}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
- self.assertEqual(response.data, expected)
+ self.assertEqual(response.data, data)
---