mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-27 03:54:01 +03:00
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:
parent
2394f05e5a
commit
25c9d552c0
|
@ -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,12 +176,51 @@ 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
|
||||
|
||||
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**
|
||||
|
|
Loading…
Reference in New Issue
Block a user