一个接口: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 有没有处理像过滤查询,模糊搜索查询的组件。有没有上面资料指点一下。
1 回答
拉风的咖菲猫
TA贡献1995条经验 获得超2个赞
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)# 后同
添加回答
举报
0/150
提交
取消