为了账号安全,请及时绑定邮箱和手机立即绑定

关于django restframework的条件查询问题

关于django restframework的条件查询问题

紫衣仙女 2018-08-10 17:05:02
一个接口: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)# 后同


查看完整回答
反对 回复 2018-08-12
  • 1 回答
  • 0 关注
  • 1933 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信