我有一个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],
...
}
答案 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