【问题标题】:Unable to fetch parameters from Django URL无法从 Django URL 获取参数
【发布时间】:2021-05-18 10:22:02
【问题描述】:

我正在使用 Django REST Framework,我想获取 URL 中输入的两个参数。

我的网址是:

http://127.0.0.1:8000/api/v1/colleges/slug2/courses/sug1/

其中 'slug2''sug1' 是输入的两个 slug 参数。

我想在我的 ModelViewSet 中检索这两个参数

views.py

class CollegeCourseViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Course.objects.all()
    lookup_field = 'slug'

    def get_serializer(self, *args, **kwargs):
        if self.action == 'retrieve':
            slug1 = self.kwargs.get('slug1')
            slug2 = self.kwargs.get('slug2')
            print(slug2)
            queryset = Course.objects.filter(slug=slug2)
            return Response(CollegeCourseSerializer(queryset, many=True).data, status=status.HTTP_200_OK)

urls.py

router = routers.DefaultRouter()

router.register(r'courses', CollegeCourseViewSet, basename='college_course_list')

urlpatterns = [
    path('api/v1/colleges/<slug:slug>/', include(router.urls)),
]

但 slug2 输出 None 并因此出现问题。

有没有具体的方法来获取这些参数。

提前致谢。

【问题讨论】:

  • 您正在尝试使用名称 slug2 获取查询参数,但您的 url 模式仅定义 slug 参数。
  • 我在 ViewSet 中包含了一个 lookup_field,因此在输入时它会给出第二个 slug。
  • lookup_field 与要查找的模型字段相关 - > url 中的 slug 字段,所以您仍然无法在此处获得任何 slug2

标签: django django-rest-framework django-rest-viewsets


【解决方案1】:

试试这个

def get_serializer(self, *args, **kwargs):
        if self.action == 'retrieve':
            slug1 = self.kwargs.get('slug1') 
            slug2 = self.kwargs.get('slug2')
            queryset = Course.objects.filter(slug2=slug2)
            return Response(CollegeCourseSerializer(queryset, many=True).data, status=status.HTTP_200_OK)

在您的 urls.py 中,我只看到 1 个 slug 被传递 i.e slug not slug1。所以,如果你想解析另一个 slug,那么你可能需要在你的 URL 中添加它,然后在视图中解析它。 如果您希望您的网址看起来像这样

http://127.0.0.1:8000/api/v1/colleges/slug2/courses/slug1/

然后你必须将你的 urls.py 更改为

 path('api/v1/colleges/<slug:slug2>/course/<slug:slug1>/', include(router.urls)),

【讨论】:

    【解决方案2】:

    实际上,我也在尝试在参数中检索 lookup_field 的 slug。但它与模型有关,而不是参数,在 cmets 中正确指出。

    所以我只是通过 ModelViewSet 中的 lookup_url_kwarg 字段访问它。

    更多详情请参考: this answer

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 1970-01-01
      • 2017-10-15
      • 2014-06-13
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      相关资源
      最近更新 更多