Python Django Rest框架。检索的工作原理

Python Django Rest框架。检索的工作原理,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我是Django rest框架的新手,我有几个问题可以帮我解决很多问题 我在看文档,寻找简单的CRUD通用视图,比如ListAPIView、Retrieve。。。等等 对于我的列表视图,我创建了如下内容: class CourseListApiView(ListAPIView): queryset = Course.objects.all() serializer_class = CourseListSerializer 这是有意义的,因为queryset返回Course.ob

我是Django rest框架的新手,我有几个问题可以帮我解决很多问题

我在看文档,寻找简单的CRUD通用视图,比如ListAPIView、Retrieve。。。等等

对于我的列表视图,我创建了如下内容:

class CourseListApiView(ListAPIView):
    queryset = Course.objects.all()
    serializer_class = CourseListSerializer
这是有意义的,因为queryset返回Course.objects.all(),所以所有课程都会出现

我不清楚的是RetrieveApi中的queryset是如何工作的

class CourseRetrieveAPIView(RetrieveAPIView):
    queryset = Course.objects.all()
    serializer_class = CourseRetrieveSerializer
这是我的检索视图,它从我的链接获取pk并返回相应的课程。我不清楚的是,为什么queryset是Course.objects.all(),而不是从URL获取kwargs并过滤我的课程的过滤查询。我尝试了我的方法,得到了同样的结果,我的观点是:

class CourseRetrieveAPIView(RetrieveAPIView):
    serializer_class = CourseRetrieveSerializer

    def get_queryset(self):
        queryset = Course.objects.filter(pk=self.kwargs.get('pk'))
        return queryset 
这更有意义,因为queryset是Course.objects.filter(pk=self.kwargs.get('pk'))而不是Course.objects.all(),因为我是通过URL中的pk筛选课程,所以对我来说没有意义


希望我的问题有意义。如果您需要任何澄清,请留下评论。我知道答案会很明显,但我对该框架非常陌生

您必须浏览
rest\u框架的代码库
。名为
get\u object
的函数使用名为
lookup\u field
lookup\u url\u kwarg
的两个类变量,它们的默认值分别为
pk
None

摘自
rest\u framework/generics.py

def get_object(self):
    """
    Returns the object the view is displaying.

    You may want to override this if you need to provide non-standard
    queryset lookups.  Eg if objects are referenced using multiple
    keyword arguments in the url conf.
    """
    queryset = self.filter_queryset(self.get_queryset())

    # Perform the lookup filtering.
    lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field

    assert lookup_url_kwarg in self.kwargs, (
        'Expected view %s to be called with a URL keyword argument '
        'named "%s". Fix your URL conf, or set the `.lookup_field` '
        'attribute on the view correctly.' %
        (self.__class__.__name__, lookup_url_kwarg)
    )

    filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
    obj = get_object_or_404(queryset, **filter_kwargs)

    # May raise a permission denied
    self.check_object_permissions(self.request, obj)

    return obj
如您所见,如果未指定任何内容,则
lookup\u url\u kwarg
设置为等于
lookup\u字段。如果将此值更改为需求的字段,则
get\u object\u或\u 404
中的过滤器将更改

现在回到您的问题,当您使用
url-kwargs
手动指定过滤器时,您没有使用
RetrieveAPIView
提供的功能。相反,您所做的是使用
pk
url kwargs
中的
get\u queryset
过滤出您的结果,然后将该查询集结果发送到
get\u object
,这将再次为您做同样的事情