Explained a bit more about django-filter implementation.

Well, I spent some time trying to gues how djang-filter works, and
if this changes would be introduced, I would have saved this time.
This commit is contained in:
Jacek Bzdak 2013-10-22 13:11:14 +02:00
parent 2394f05e5a
commit 25c9d552c0

View File

@ -165,8 +165,8 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha
from rest_framework import generics from rest_framework import generics
class ProductFilter(django_filters.FilterSet): class ProductFilter(django_filters.FilterSet):
min_price = django_filters.NumberFilter(lookup_type='gte') min_price = django_filters.NumberFilter(name="price", lookup_type='gte')
max_price = django_filters.NumberFilter(lookup_type='lte') max_price = django_filters.NumberFilter(name="price", lookup_type='lte')
class Meta: class Meta:
model = Product model = Product
fields = ['category', 'in_stock', 'min_price', 'max_price'] fields = ['category', 'in_stock', 'min_price', 'max_price']
@ -176,12 +176,51 @@ For more advanced filtering requirements you can specify a `FilterSet` class tha
serializer_class = ProductSerializer serializer_class = ProductSerializer
filter_class = ProductFilter filter_class = ProductFilter
Which will allow you to make requests such as: Which will allow you to make requests such as:
http://example.com/api/products?category=clothing&max_price=10.00 http://example.com/api/products?category=clothing&max_price=10.00
For more details on using filter sets see the [django-filter documentation][django-filter-docs]. For more details on using filter sets see the [django-filter documentation][django-filter-docs].
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
--- ---
**Hints & Tips** **Hints & Tips**