如何在 Django Rest Framework 中使用 lookup_field 和 FilterSet?

问题描述

我正在为一个项目开发 API,它包含一个课程列表页面,其中

  1. 列出了特定学院提供的所有课程。
  2. 支持使用 lookup_field 作为 course_slug 检索特定课程。
  3. 支持基于一些其他参数过滤课程,我在 Django FilterSet 和 filterset_class (filterset_class) 的帮助下实现了这些参数。

问题是,一旦根据要求过滤了课程,URL 中也会包含查询参数。现在,我无法对它进行检索操作,因为 URL 无法识别添加的 lookup_field 并将其错误查询参数中的模式。

视图集.py

class CollegeCourseViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = CourseSerializer
    lookup_field = 'slug'
    filter_backends = (SearchFilter,DjangoFilterBackend,)
    search_fields = ['name']
    filterset_class = CourseFilter

    def get_queryset(self):
        queryset = Course.objects.all()
        return queryset.filter(college_courses__college__slug=self.kwargs['college_slug'])

    def get_object(self):
        obj = super().get_object()
        if self.action == 'retrieve':
            obj.additional = CollegeCourse.objects.filter(course=obj,college__slug=self.kwargs['college_slug']).first()
        return obj

    def get_serializer_class(self):
        if self.action == 'retrieve':
            return CollegeCourseSerializer
        return super().get_serializer_class()

过滤器.py

class CourseFilter(filters.FilterSet):
name = filters.MultipleChoiceFilter(field_name='college_courses__stream__name',choices=choices("STREAM_NAME_CHOICES"))
category = filters.MultipleChoiceFilter(field_name='college_courses__stream__category',choices=choices("STREAM_CATEGORY_CHOICES"))
program = filters.MultipleChoiceFilter(field_name='college_courses__stream__program',choices=choices("STREAM_PROGRAM_CHOICES"))

class Meta:
    model = Course
    fields = [
        'name','category','program'
    ]

urls.py

router = routers.DefaultRouter()
router.register(r'courses',CollegeCourseViewSet,basename='college_course')

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

假设我根据类别 = 农业进行过滤,我会得到一个包含三门课程的列表。现在,我想使用其 slug 检索其中一门课程。但这是错误的请求消息

网址

GET /api/college/v1/colleges/clslug1/courses/?category=Agriculture/crslug2

crslug2 是课程的 slug。

留言

"Select a valid choice. Agriculture/crslug2 is not one of the available choices."

有什么办法可以在查询参数后添加lookup_field?

提前致谢。

解决方法

好的,所以回答我自己的帖子。基本上一切都很好,只是 URL 不是 RESTful。

lookup_field 必须在 RESTful apis 中的任何查询参数之前给出。

所以正确的格式是

GET /api/college/v1/colleges/clslug1/courses/crslug2/?category=Agriculture

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...