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



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

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

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

ViewSet.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()

filters.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)),
]

假设我基于category = Agriculture进行筛选,我将得到一个包含三个课程的列表。现在,我想用它的鼻涕找回其中一门课。但是这里是错误请求消息

URL

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

crslug2是本课程的段塞。

消息

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

是否有任何方法添加查询参数后的lookup_field ?

提前感谢。

回复我自己的帖子。除了URL不是RESTful之外,基本上一切都很好。

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

所以正确的格式是

GET/api/大学/v1/学院/clslug1/课程/crslug2/?农业类别=

最新更新