如何在Django Rest Framework 3中覆盖ModelViewSet的get_queryset?

Ros*_*ers 12 django-rest-framework

我曾经在Django Rest Framework(DRF)2中遵循这种模式:

class Foo(models.Model):
    user = models.ForeignKey(User)

class FooSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Foo
        fields = ('url')

class FooViewset(viewsets.ModelViewSet):
    def get_queryset(self):
        return Foo.objects.filter(user=self.request.user)
    serializer = FooSerializer
    model = Foo # <-- the way a ModelViewSet is told what the object is in DRF 2

[ in urls.py]
from rest_framework import routers
router = routers.DefaultRouter()
router.register('Foo', views.FooViewSet)
Run Code Online (Sandbox Code Playgroud)

在DRF 3中,我现在得到:

AssertionError at /
`base_name` argument not specified, and could not automatically  
 determine the name from the viewset, as it does not have a   
`.queryset` attribute.
Run Code Online (Sandbox Code Playgroud)

如何get_queryset覆盖一个实例rest_framework.viewsets.ModelViewSet

Ros*_*ers 17

想出这个.该model领域rest_framework.viewsets.ModelViewSet似乎是在DRF3擅离职守.现在,如果你重写get_queryset你需要指定第三个参数routers.DefaultRouter().register是该basename参数.然后,该函数将不会关闭并尝试在该不存在的queryset字段上找到它ModelViewSet.

例如

router = routers.DefaultRouter()
[...]
router.register('/rest/FooBar'/, views.FooBarViewSet, 'foobar-detail')
                                                     #^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

  • 以下是相关文档:http://www.django-rest-framework.org/api-guide/routers/#usage (3认同)
  • 在你的`urls.py`文件中,你创建了一个路由器,如`router = routers.DefaultRouter()`.然后在每个视图集上调用`router.register()`.当你调用`router.register()`时,你必须提供第三个参数,如`foobar-detail`.例如`router.register('/ rest/FooBar'/,views.FooBarViewSet,'foobar-detail')` (2认同)
  • 如 [django-rest-framework 文档](https://www.django-rest-framework.org/api-guide/permissions/#using-with-views-that-do-not-include-a- 中所述queryset-attribute),您可以使用查询集哨兵来确保模型权限正常工作并提供用于路由目的的基本名称。即添加 `queryset = Foo.objects.none()` 并继续覆盖 `get_queryset()`。 (2认同)