我已经设置了一个列,其中一个表名为Establishment_Type
现在,我正在尝试根据Establishment_Type进行过滤。
这是我的view.py代码
class ShopDetailAPIView(ListAPIView):
serializer_class = ShopDetailSerializer
def get_queryset(self):
queryset = Shop.objects.all()
type = self.request.query_params.get('type', None)
type2 = self.request.query_params.get('type2', None)
if type is not None and type2 is None:
queryset = queryset.filter(Establishment_Type = type)
elif type is not None and type2 is not None:
queryset = queryset.filter(Q(Establishment_Type = type) | Q(Establishment_Type = type2))
return queryset
在网址中,我通过输入以下内容进行查询:
http://127.0.0.1:8000/shop/search/?type=Restaurant&type2=Petrol%20Station
仅过滤Establishment_Type =餐厅但不包括Establishment_Type =加油站
这是我的应用程序中的urls.py
名为shop:
urlpatterns = [
url(r'^$', ShopListAPIView.as_view(), name = 'list' ),
#####
url(r'^create/$', ShopCreateAPIView.as_view(), name = 'create' ),
url(r'^search/$', ShopDetailAPIView.as_view(), name = 'detail'),
]
我的网址过滤2建立类型错了吗?
我是否需要更改代码中的某些内容才能过滤“Establishment_Type”列中的2个值?
答案 0 :(得分:0)
谢谢@ Thyrst'建议我使用Establishment_Type__in = types
我已经通过这种方式修改我的代码以使我的过滤器正常工作
class ShopDetailAPIView(ListAPIView):
serializer_class = ShopDetailSerializer
def get_queryset(self):
queryset = Shop.objects.all()
type = self.request.query_params.get('type', None)
type = type.split(',')
if type is not None:
queryset = queryset.filter(Establishment_Type__in = type)
return queryset
所以类型现在是列表,因此在输入url:
时http://127.0.0.1:8000/shop/search/?type=Restaurant,Petrol%20Station
根据餐厅和加油站过滤。
只输入1个或更多值时也可以使用。
现在这很好,但我觉得可能有更好的方法来实现它。
答案 1 :(得分:0)
使用 django-filter
package 有一种更简单的方法可以实现这一点。在 django-filter
documentation 的深处,它提到您可以使用“映射到查找列表的字段名称字典”。
您的代码将像这样更新:
# views.py
from django_filters.rest_framework import DjangoFilterBackend
class ShopDetailAPIView(ListAPIView):
queryset = Shop.objects.all()
serializer_class = ShopDetailSerializer
filter_backends = [DjangoFilterBackend]
filter_fields = {
'type': ["in", "exact"]
}
现在在 URL 中,您需要在提供参数列表之前将 __in
添加到过滤器中,它会按您的预期工作:
http://127.0.0.1:8000/shop/search/?type__in=Restaurant,Petrol%20Station
关于可用查找过滤器的 django-filter
文档非常糟糕,但 Django documentation 本身中提到了 in
查找过滤器。