在设置视图集时,出现错误AttributeError:'function'对象没有属性'get_extra_actions'

时间:2018-09-25 00:26:47

标签: python django serialization django-models django-rest-framework

我正在学习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中       route = 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:“函数”对象没有属性“ get_extra_actions”

我认为,应该在get_extra_actions类中编写QuestionView方法,如果是,我该怎么写?这样吗?

def get_extra_actions() : 
    return  ???

如果不是,那是什么问题?

[编辑]

当我在网址部分擦除.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.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 =检查(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行,获取       res =实例。 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 \ functional.py”,   第36行,获取       res =实例。 dict [self.name] = self.func(instance)文件“ C:\ Users \ 1Sun \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ django \ urls \ resolvers.py”,   urlconf_module中的第529行       返回import_module(self.urlconf_name)文件“ C:\ Users \ 1Sun \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ importlib__init __。py”,   import_module中的第126行       在_gcd_import文件中,返回_bootstrap._gcd_import(name [level:],程序包,级别)文件“”,第994行   _find_and_load文件中的“”行971   “”,第955行,在_find_and_load_unlocked中   _load_unlocked中的文件“”,行665,
  在第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 \ 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”,   import_module中的第126行       在_gcd_import文件中,返回_bootstrap._gcd_import(name [level:],程序包,级别)文件“”,第994行   _find_and_load文件中的“”行971   “”,第955行,在_find_and_load_unlocked中   _load_unlocked中的文件“”,行665,
  在第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(“ actions参数必须在” TypeError:调用时必须提供actions参数   .as_view()在ViewSet上。例如.as_view({'get': 'list'})

3 个答案:

答案 0 :(得分:1)

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

因此,将是这样的:

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

希望对您有帮助!

答案 1 :(得分:0)

路由器

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

所以应该是

router.register('question', cebula_views.QuestionView, 'userpage-question')
代替

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

}), 'userpage-question')

答案 2 :(得分:0)

使用此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)