mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-23 10:03:57 +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
|
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**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user