django rest framework 怎么获取url参数

from drf_multiple_model.views import FlatMultipleModelAPIView
from api.pager import LimitPagination
from rest_framework import filters
from django.http import request

#视图函数
class SearchGroup(FlatMultipleModelAPIView):
    authentication_classes=[]     #取消全局用户认证
    permission_classes=[]       #取消全局权限验证
    throttle_classes=[]
   
     project_name=request.GET.get('project_anme')          # 此行出错,      这个类里面,我要怎么获取 url 传过来的 参数
     orderdate_gte=request.GET.get('order_date_gte')     # 此行出错,      这个类里面,我要怎么获取 url 传过来的 参数
     orderdate_ite=request.GET.get('order_date_ite')       # 此行出错,      这个类里面,我要怎么获取 url 传过来的 参数
    querylist=[
        {'queryset':models.Pro1.objects.filter(project_name__contains=project_name,order_date__gte=orderdate_gte,order_date__ite=orderdate_ite),
         'serializer_class': SearchGroupRebarSerializer,
        },
        {'queryset':models.Pro2.objects.filter(project_name__contains=project_name,order_date__gte=orderdate_gte,order_date__ite=orderdate_ite),
         'serializer_class': SearchGroupRebarSerializer,
        },
    ]
    pagination_class=LimitPagination   # 这个类分页只能用limit

django-rest-framework 会对 django 中的request进行包装,所有不能按django那样来使用request对象

解决办法:

  1. request.GET改为request.query_params,使用drf的方式获取url参数
  1. request 要写在方法里而不是类里,现在只是定义类,在之后收到请求才会实用类,前后关系错了

稍后可以给你写个demo代码吧


后面,querylist 的写法也有点问题,
project_name__contains 是因为变量名叫project_name 还是 models.Pro2有一个属性名叫做project_name?


更新:

class SearchGroup(FlatMultipleModelAPIView):
    def initial(self, request, *args, **kwargs):
        super(SearchGroup, self).initial(request, *args, **kwargs)
        # 代码执行到这里时,说明请求已经收到,才可以从url获取数据

        project_name = request.query_params.get("project_anme")
        orderdate_gte = request.query_params.get("order_date_gte")
        orderdate_ite = request.query_params.get("order_date_ite")

        # 修改API视图的querylist属性,注意每次请求只可以self的,不要修改类,否则引发bug
        self.querylist = [
            {
                "queryset": models.Pro1.objects.filter(
                    project_name__contains=project_name,
                    order_date__gte=orderdate_gte,
                    order_date__ite=orderdate_ite,
                ),
                "serializer_class": SearchGroupRebarSerializer,
            },
            {
                "queryset": models.Pro2.objects.filter(
                    project_name__contains=project_name,
                    order_date__gte=orderdate_gte,
                    order_date__ite=orderdate_ite,
                ),
                "serializer_class": SearchGroupRebarSerializer,
            },
        ]

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《django rest framework系列09-基于请求参数或者url地址使用rest内置版本控制类流程》, 一起来围观吧

这样弄也出错 TypeError: geturl() missing 1 required positional argument: 'request'

    def geturl(request):
        project_name=request.query_params('project_anme')
        order_date_gte=request.query_params('order_date_gte')
        order_date_ite=request.query_params('order_date_ite') 
        return [project_name,order_date_gte,order_date_ite]
    querylist=[
        {'queryset':models.Rebar.objects.filter(project_name__contains=geturl()[0],order_date__gte=geturl()[1],order_date__ite=geturl()[2],),
         'serializer_class': SearchGroupRebarSerializer,
        },
        {'queryset':models.ConcreteCube.objects.all(),
         'serializer_class': SearchGroupRebarSerializer,
        },
    ]