【问题标题】:what is queryset = super().get_queryset()?什么是 queryset = super().get_queryset()?
【发布时间】:2021-05-26 16:07:16
【问题描述】:

这两段代码完全相同

class PostDetail(generic.DetailView):
    model = models.Post

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(.........)

class PostDetail(generic.DetailView):
    model = models.Post

    def get_queryset(self):
        return post.filter(.........)

queryset = super().get_queryset() 这条线实际上是做什么的?如果没有这条线会发生什么?

【问题讨论】:

  • super().get_queryset()调用其父类的get_queryset()方法,如果有多个父类则遵循MRO来确定调用哪个类方法。
  • 以及如果没有这行会发生什么->函数get_queryset()不会从父类继承,只会执行新写的函数
  • @VishalSingh 其父类的get_queryset() 将返回什么

标签: django django-rest-framework django-views django-queryset


【解决方案1】:

两者并不相同,或者至少不是本身super() 用于获取get_queryset 的实现,它是方法解析顺序(MRO)中的下一个。如果类只有一个基类,您可以将其视为父类,但在 Python 中多重继承是允许的,因此 MRO 的规则更加复杂。

不管怎样,super().get_queryset 将因此调用get_queryset 它是如何在此处为DetailView 类实现的。这是一个重要的区别,因为基本的get_queryset() 方法将首先查找queryset 属性,如果不存在,它将使用model._default_manager.all()

如果您因此指定queryset 属性,则两者并不相同,例如,如果我们定义queryset 为:

class PostDetail(generic.DetailView):
    model = models.Post
    queryset = models.Post.objects.filter(active=True)

那么您使用super().get_queryset() 的实现将只显示活跃的Posts,而使用Post.objects.filter(…) 的实现将显示所有满足过滤器但不是活跃的Posts 的帖子。

如果您将使用 mixins,那么它将根据您使用 mixins 的顺序调用其中一个 mixins 的 get_queryset(),从而可以产生更复杂的过滤。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多