关于django restframework的条件查询问题

一个接口:http://127.0.0.1:8000/api/v1/course/ 对应的处理视图如下

class CourseView(APIView):
    # renderer_classes = [JSONRenderer,]

    def get(self, request, *args, **kwargs):
        ret = {"code": 1}        try:
            queryset = models.Course.objects.all()
            ser = CourseSerializer(instance=queryset, many=True)
            ret["data"] = ser.data        except Exception as e:
            ret["code"] = 0
            ret["msg"] = "获取数据失败"
        return Response(ret)

该接口是不带参数的,返回的也是.all()全部的数据。

那么问题来了,如果我要写一个接口 api/products/,这个接口呢,假如有三个非必填参数,比如
产品名称:name(可以模糊查询),产品类型:type;生产时间:time。
如果一个参数都不带,name就返回 .all()全部数据,

这个问题该如何处理呢?

我现在的想法是:
1/判断是否带参数 若果不带参数,就返回.all()
2/如带了一个或多个参数,就用.filter(key1 = value1,key2=value2 ...)这样的形式去查数据。
思考了一下,如果以这样的形式去判断参数逻辑是否太复杂?或者我这样的想法是错误的。因为serializer,比如上面的CourseSerializer对象instance参数需要传入的是一个.all()的queryset对象。

restframework 有没有处理像过滤查询,模糊搜索查询的组件。有没有上面资料指点一下。


紫衣仙女
浏览 1875回答 1
1回答

拉风的咖菲猫

1.忘记all(),全部用filter().filter()在无条件的时候=all()2.现在我们需要的是判断是否存在条件.# 变量名尽量不要用time 和type,他们分别是内置模块名和内置方法名. name = request.GET.get("name") type = request.GET.get("type") time = request.GET.get("time")# 现在我们有了三个条件.判断他们是否存在,如果存在就要作为条件传给filter()kwargs = {}if name:     kwargs["name__contains"] = nameif type:     kwargs["type"] = typeif time:     kwargs["time"] = time queryset = models.Course.objects.filter(**kwargs)# 后同
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python