Django休息框架,应该能够覆盖get_queryset而不是定义queryset属性吗?

时间:2016-09-11 12:01:10

标签: python django django-rest-framework

我很困惑。查看ViewSet源代码,看起来我应该无法在视图集中定义查询集,然后只是覆盖get queryset函数以获取我想要的任何查询集。但我的代码失败了这个错误:

AssertionError: `base_name` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.

所以,即使我覆盖了queryset属性,我仍然需要在开始时将它设置为某个假属性...这样可行,但是定义查询集然后只是稍后覆盖它会感觉很奇怪。

class StudyQuestion(viewsets.ReadOnlyModelViewSet):
    queryset = Model.objects.all()
    serializer_class = ModelSerializer
    permission_classes = (permissions.IsAuthenticated, )

    def get_queryset(self):
        """"""
        return Model.objects.order_by('-word__frequency')

2 个答案:

答案 0 :(得分:3)

DRF ModelViewSet使用queryset派生URL基础。如果未设置queryset属性,DRF会在注册路由器时声明您使用可选的base_name属性来声明基础。

在DRF文档中查看此页面:

http://www.django-rest-framework.org/api-guide/routers/

答案 1 :(得分:2)

DRF路由器抱怨,因为它不能automatically generate a basename for the viewset

  

base_name - 用于创建的URL名称的基础。如果未设置,将根据视图集的queryset属性自动生成基本名称(如果有)。请注意,如果视图集不包含queryset属性,则必须在注册视图集时设置base_name。