在上一篇文章中,我們介紹了 django-filter 的基本功能曹抬。實(shí)際上 django-filter 還可以實(shí)現(xiàn)更高級的搜索,比如說文本的模糊查詢堰酿,日期的范圍查詢张足。
繼續(xù)我們的例子:
class Product(models.Model):
name = models.CharField(max_length=100)
created_at = models.DatetimeField()
class ProductSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
class ProductFilter(django_filters.FilterSet):
sort = django_filters.OrderingFilter(fields=('created_at',))
class Meta:
model = Product
fields = ['name',]
class ProductListView(generics.ListView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = ProductFilter
首先要實(shí)現(xiàn)按 name 的模糊查詢。上面 ProductFilter 里面的 fields嗅榕,如果是 list吵聪,默認(rèn)就是按=來匹配。它還支持 dict 的格式吟逝,可以選擇更多的匹配方式。按 name 的模糊匹配励稳,只需把 fields 改成如下即可:
fields = {
'name': ['icontains']
}
使用 API 查詢是原來的 url 是/products/
, 模糊查詢的 url 就變成/products/?name__icontains=xxx
囱井。
接下來實(shí)現(xiàn)按 created_at 按日期范圍來搜索。一個(gè)方法是直接在 fields 里面配置:
fields = {
'name': ['icontains'],
'created_at': ['date__gte', 'date__lte']
}
然后就可以用下面的 url 來進(jìn)行日期范圍搜索:/products/?created_at__date__gte=2018-01-01&created_at__date__lte=2018-04-01
如果你覺得這個(gè) param 名字太長新翎,還可以自定義 filter 字段:
class ProductFilter(django_filters.FilterSet):
sort = django_filters.OrderingFilter(fields=('created_at',))
min_date = django_filters.DateFilter(name='created_at__date', lookup_expr='gte')
max_date = django_filters.DateFilter(name='created_at__date', lookup_expr='lte')
class Meta:
model = Product
fields = {
'name': ['icontains'],
}
然后搜索的 url 變成這樣:/products/?min_date=2018-01-01&max_date=2018-04-01
想一想如果用java寫需要多少代碼吧...