Django在同一列中过滤多个值

时间:2017-03-30 08:03:16

标签: python django django-rest-framework

我已经设置了一个列,其中一个表名为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个值?

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 查找过滤器。