在设置视图集时,出现错误 AttributeError: 'function' object has no attribute 'get_extra_actions'

1Su*_*Sun 8 python django serialization django-models django-rest-framework

我正在学习DRF,现在感到有点困惑。
我设置QuestionViewQuestionSerializer喜欢这个。

视图.py

class QuestionView(viewsets.ModelViewSet) :
    queryset = models.Question.objects.all()
    serializer_class = QuestionSerializer

    def list(self, request, *args, **kwargs):
        serializer = QuestionSerializer(models.Question.objects.all())
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

序列化器.py

class QuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model= Question
        fields= ("question_text", "owner", "pub_date")
Run Code Online (Sandbox Code Playgroud)

urls.py

router = routers.DefaultRouter()
router.register('profile', cebula_views.SettingView)
router.register('question', cebula_views.QuestionView.as_view({
    'get':'list',

}), 'userpage-question')

urlpatterns = [
    ...
    url(r'^', include(router.urls)),
    ...
] 
Run Code Online (Sandbox Code Playgroud)

文件“C:\Users\1Sun\Cebula3\businessproject\urls.py”,第 34 行,在 url(r'^', include(router.urls)) 中,文件“C:\Users\1Sun\AppData\Local\ Programs\Python\Python36\lib\site-packages\rest_framework\routers.py”,第 101 行,在 url self._urls = self.get_urls() 文件“C:\Users\1Sun\AppData\Local\Programs\Python\ Python36\lib\site-packages\rest_framework\routers.py”,第 363 行,在 get_urls urls = super(DefaultRouter, self).get_urls() 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36 \lib\site-packages\rest_framework\routers.py”,第 261 行,在 get_urls paths = self.get_routes(viewset) 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site- packages\rest_framework\routers.py",第 176 行,在 get_routes extra_actions = viewset.get_extra_actions() AttributeError: 'function' 对象没有属性 'get_extra_actions'

在我看来,我应该get_extra_actions在类中编写方法QuestionView,如果是这样,我该怎么写?像这样?

def get_extra_actions() : 
    return  ???
Run Code Online (Sandbox Code Playgroud)

如果没有,问题出在哪里?

[编辑]

当我删除 url 部分的 .as_view() 并写成这样router.register('question', cebula_views.QuestionView, 'userpage-question')

错误是

由 .wrapper 在 0x00000283172D3D08> 处启动的线程中出现未处理的异常> 回溯(最近一次调用最后一次):文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\utils\autoreload.txt” py”,第 225 行,包装器 fn(*args, **kwargs) 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\management\commands\ runserver.py”,第 120 行,inner_run self.check(display_num_errors=True) 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\management\base .py”,第 364 行,检查 include_deployment_checks=include_deployment_checks,文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\management\base.py”,行351、在_run_checks中返回checks.run_checks(**kwargs)文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\checks\registry.py”,行73、在 run_checks new_errors = check(app_configs=app_configs) 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\checks\urls.py”,第 13 行,在 check_url_config 中返回 check_resolver(resolver) 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\checks\urls.py”,第 23 行,在 check_resolver 返回中check_method() 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\urls\resolvers.py”,第 397 行,检查 self.url_patterns 中的模式:文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\utils\features.py”,第 36 行,在get res = instance 中。dict [self.name] = self.func(instance) 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\urls\resolvers.py”,第 536 行,在 url_patterns 模式 = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 文件 "C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\utils\function.py ”,第 36 行,在get res = instance. dict [self.name] = self.func(instance) 文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\urls\resolvers.py”,第 529 行,在 urlconf_module 中 return import_module(self.urlconf_name) 文件 "C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\importlib__init__.py",第 126 行,在 import_module 中 return _bootstrap._gcd_import(name[level:] 、包、级别) 文件“”,第 994 行,在 _gcd_import 中 文件“”,第 971 行,在 _find_and_load 中 文件“”,第 955 行,在 _find_and_load_unlocked 中 文件“”,第 665 行,在 _load_unlocked 中
文件“”,第 678 行,在 exec_module 文件“”,第 219 行,在 _call_with_frames_removed 文件“C:\Users\1Sun\Cebula3\businessproject\urls.py”,第 31 行,在 url(r'^cebula/', include('cebula.urls',namespace='cebula')), 文件 "C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\urls\conf.py",第 34 行,在 include urlconf_module = import_module(urlconf_module) 文件 "C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\importlib__init__.py" 中,第 126 行,在 import_module return _bootstrap._gcd_import(name[level :],包,级别)文件“”,第 994 行,
文件“”,第 678 行,在 exec_module 文件“”,第 219 行,在 _call_with_frames_removed 文件“C:\Users\1Sun\Cebula3\cebula\urls.py”,第 15 行,在 url(r'^question/$', views.QuestionView.as_view(),name='question'),文件“C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\viewsets.py”,第 68 行,在 as_view 中引发 TypeError(" actionsTypeError:actions调用 ViewSet 时必须提供参数 .as_view()。例如.as_view({'get': 'list'})

小智 9

我不知道为什么,但我也无法使用路由器创建路由(使用 .as_view())。但是,当我尝试直接在 urlpatterns 中创建路线时,它对我有用。

所以,它会是这样的:

urlpatterns = [
    path('question', cebula_views.QuestionView.as_view({
         'get':'list',
         }), 'userpage-question'),
]
Run Code Online (Sandbox Code Playgroud)


JPG*_*JPG 5

在路由器.as_view()中注册视图集时不必使用方法

所以,应该是

router.register('question', cebula_views.QuestionView, 'userpage-question')
Run Code Online (Sandbox Code Playgroud) 代替

router.register('question', cebula_views.QuestionView.as_view({
    'get':'list',

}), 'userpage-question')
Run Code Online (Sandbox Code Playgroud)