在 Django 基于类的视图中传递查询参数

Mel*_*art 7 python django

我正在尝试形成这样的网址, http://localhost:8000/mealplan/meals/search/2?from_date=2019-12-29&to_date=2019-12-30&from_time=06:00&to_time=22:00

这是我在 urls.py 中尝试过的

    url(r'^meals/search/(?P<user_id>[\w.-]+)/(?P<from_time>[\w.-]+)/(?P<to_time>[\w.-]+)/(?P<from_date>[\w.-]+)/(?P<to_date>[\w.-]+)$', FilterMealList.as_view(), name='filter_meals'),
Run Code Online (Sandbox Code Playgroud)

显然这不起作用。我收到 404,邮递员上不存在 url。这也是我基于班级的观点。

class FilterMealList(views.APIView):
    def get(self, request, **kwargs):
        try:
            from_time, to_time, from_date, to_date = kwargs.get('from_time'), kwargs.get('to_time'), kwargs.get(
                'from_date'), kwargs.get('to_date')
            return Response({"Suceess": "{}, {}, {}, {}".format(from_time, to_time, from_date, to_date)},
                            status=status.HTTP_200_OK)
        except KeyError as e:
            return Response({"Failure": "Incomplete query params"}, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,1.如何定义一个 url 来在 django 中获取查询参数?2. 如何在基于类的视图中捕获参数?

如何创建一个 url 来获取 django 中的查询参数

Avr*_*zky 6

用于request.GET获取查询参数的字典。参数不应在urls.py.

请参阅文档:https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpRequest.GET


Wil*_*sem 5

问号后面的部分称为查询字符串。它在 中作为类似字典的对象 (a QueryDict)进行处理并可用self.request.GET

因此您定义为路径

url(r'^meals/search/(?P<user_id>\d+), FilterMealList.as_view()),
Run Code Online (Sandbox Code Playgroud)

在您看来,您可以使用以下方法进行过滤:

class FilterMealList(views.APIView):

    def get(self, request, **kwargs):
        user_id = self.kwargs['user_id']
        from_time = self.request.GET.get('from_time')
        to_time = self.request.GET.get('to_time')
        from_date = self.request.GET.get('from_date')
        to_date = self.request.GET.get('to_date')
        # …
Run Code Online (Sandbox Code Playgroud)

  • @hackks:因为 *path* 参数放在 `self.kwargs` 中,查询字符串放在 `self.reqest.GET` 中。 (2认同)
  • LoL,过去三年来我一直在使用 DRF 来编写 REST API,直到昨天我才知道这一点,然后我看到了这篇文章,然后搜索了 django 和 [DRF 文档](https://www.django-rest-framework. org/api-guide/filtering/#filtering-against-the-url)及其源代码。最后了解到有两种URL参数*path*和*querystring*。在这里感觉自己像个菜鸟:)。顺便说一句,非常感谢。 (2认同)