POST中的Django多字段过滤

时间:2018-10-20 02:52:27

标签: python django-rest-framework

我有一个Restaurant表,其中包含Cuisine_type和outlet_type等字段,其中Cuisine_type具有Cuisine表(pk,Cuisine_type),而outlet_type具有Outlet表(pk,outlet_type)。还有更多字段,例如is_vegeterian_friendly,负担能力等。用户可以自由选择要转换的任何字段,但我不希望创建这些字段的组合来处理每个请求。那是疯狂。

用户可以对POST请求正文中的任何字段应用过滤器,如下所示:

{
    "outlet_type":  1, 
    "cuisine_type": 2,
    ...
}

该视图将在过滤器之后返回餐厅列表

class RestaurantList(APIView):
    def post(self, request, format=None):
        filter = dict(request.data)
        retaurants = Restaurant.objects.filter(**filter)
        serializer = RestaurantSerializer(retaurants, many=True)
        return Response(serializer.data)

但是,例如,当一个字段下有多个选择时,他们想要过滤多个Cuisine_type(例如1和2),则请求的正文必须添加__in才能使其起作用。

{
    "outlet_type":  1, 
    "cuisine_type__in": [1, 2],
    ...
}

还有更好的方法吗?我期望我们不需要更改键名,而只需将值设为数组即可,例如:

{
    "outlet_type":  1, 
    "cuisine_type": [1, 2],
    ...
}

1 个答案:

答案 0 :(得分:0)

您应尝试使用django-filter库进行过滤。它非常易于使用,并提供了一系列过滤选项。

对于您的情况,您可以从以下内容开始:

class RestaurantFilter(django_filters.FilterSet):
    #use appropriate field names below.
    outlet_type = django_filters.CharFilter(name="outlet_type", lookup_type="contains")
    cuisine_type = django_filters.CharFilter(name="cuisine_type", lookup_type="contains")

class Meta:
    model = Restaurant