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

Posted

技术标签:

【中文标题】在设置视图集时,出现错误 AttributeError: \'function\' object has no attribute \'get_extra_actions\'【英文标题】:In setting viewset, I got an error AttributeError: 'function' object has no attribute 'get_extra_actions'在设置视图集时,出现错误 AttributeError: 'function' object has no attribute 'get_extra_actions' 【发布时间】:2019-02-28 12:49:51 【问题描述】:

我正在学习 DRF,现在有点困惑。 我这样设置QuestionViewQuestionSerializer

views.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)

serializer.py

class QuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model= Question
        fields= ("question_text", "owner", "pub_date")

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)),
    ...
] 

文件“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 行,在网址中 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 中 路线 = 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' object has no attribute 'get_extra_actions'

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

def get_extra_actions() : 
    return  ???

如果不是,问题是什么?

[编辑]

当我在 url 部分擦除 .as_view() 并写成 router.register('question', cebula_views.QuestionView, 'userpage-question')

错误是

.wrapper 在 0x00000283172D3D08 处启动的线程中未处理的异常> Traceback(大多数 最近通话最后):文件 "C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django\utils\autoreload.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\functional.py”, 第 36 行,在 get 中 res = instance.dict[self.name] = self.func(instance) File "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\functional.py", 第 36 行,在 get 中 res = instance.dict[self.name] = self.func(instance) File "C:\Users\1Sun\AppData\Local\Programs\Python\Python36\lib\site-packages\django \urls\resolvers.py", 第 529 行,在 urlconf_module 中 返回 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:], package, level) File "", line 994, in _gcd_import File "",第 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 行,包括 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:], package, level) File "", line 994, in _gcd_import File "",第 971 行,在 _find_and_load 文件中 “”,第 955 行,在 _find_and_load_unlocked 文件“”,第 665 行,在 _load_unlocked 文件“”,第 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 中 raise TypeError("TypeError 时必须提供actions 参数:调用时必须提供actions 参数 .as_view() 在 ViewSet 上。例如.as_view('get': 'list')

【问题讨论】:

【参考方案1】:

使用此 URL 格式。

    from django.urls import path
    from rest_framework.urlpatterns import format_suffix_patterns
    from .views import QuestionView

    urlpatterns = [
     path('QuestionView/', QuestionView),
    ]

    urlpatterns = format_suffix_patterns(urlpatterns)

【讨论】:

【参考方案2】:

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

所以,应该是这样的:

urlpatterns = [
    path('question', cebula_views.QuestionView.as_view(
         'get':'list',
         ), 'userpage-question'),
]

希望对你有帮助!

【讨论】:

我知道回答这个问题有点太晚了哈哈,但它可能会帮助遇到同样问题的其他人:D【参考方案3】:

routers

中注册视图集时,您不必使用 .as_view() 方法

所以,应该是

router.register('question', <b>cebula_views.QuestionView</b>, 'userpage-question')
代替
router.register('question', cebula_views.QuestionView.as_view(
    'get':'list',

), 'userpage-question')

【讨论】:

我也想这样做,但是当我像router.register('question', cebula_views.QuestionView, 'userpage-question') 这样写时,错误是 > 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(“必须提供 actions 参数when " TypeError: 在 ViewSet 上调用 .as_view() 时必须提供 actions 参数。例如 .as_view('get': 'list') 请通过编辑将完整的回溯添加到问题部分

以上是关于在设置视图集时,出现错误 AttributeError: 'function' object has no attribute 'get_extra_actions'的主要内容,如果未能解决你的问题,请参考以下文章

错误支持 v4 view.NestedScrollingChild2 在回收视图集适配器

使用DRF视图集时自定义action方法

ViewSet-视图集的简单学习

如何使用模型视图集和 POST 请求创建对象?

drf之视图集

视图集ViewSets