首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django Rest框架。检索的工作原理

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

Stack Overflow用户
提问于 2017-10-21 12:55:43
回答 1查看 4.2K关注 0票数 4

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

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

对于我的列表视图,我是这样创建的:

代码语言:javascript
运行
复制
class CourseListApiView(ListAPIView):
    queryset = Course.objects.all()
    serializer_class = CourseListSerializer

这是有意义的,因为查询集返回Course.objects.all(),所以所有的课程都会出现。

我不清楚的是RetrieveApi中的查询集是如何工作的

代码语言:javascript
运行
复制
class CourseRetrieveAPIView(RetrieveAPIView):
    queryset = Course.objects.all()
    serializer_class = CourseRetrieveSerializer

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

代码语言:javascript
运行
复制
class CourseRetrieveAPIView(RetrieveAPIView):
    serializer_class = CourseRetrieveSerializer

    def get_queryset(self):
        queryset = Course.objects.filter(pk=self.kwargs.get('pk'))
        return queryset 

这更有意义,因为查询集是Course.objects.filter(pk=self.kwargs.get('pk'))而不是Course.objects.all(),这对我来说没有意义,因为我是通过URL中的pk来过滤课程的

希望我的问题说得通。如果您需要任何澄清,请留下评论。我知道答案是显而易见的,但我对这个框架非常陌生。

EN

回答 1

Stack Overflow用户

发布于 2017-10-21 13:06:46

你必须通过rest_framework的代码库。名为get_object的函数使用两个名为lookup_fieldlookup_url_kwarg的类变量,它们的默认值分别为pkNone

摘自rest_framework/generics.py中的GenericAPIView

代码语言:javascript
运行
复制
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_url_kwarg设置为等于lookup_field。如果您将此值更改为您的需求字段,则get_object_or_404中的筛选器将发生更改。

现在回到您的问题上,当您使用url kwargs手动指定筛选器时,您没有使用RetrieveAPIView提供的功能。相反,您要做的是用pkget_queryset中的url kwargs过滤出结果,然后将QuerySet结果发送到get_object,它将再次为您做同样的事情。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46860183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档