我正在学习DRF,现在有点困惑。
我这样设置QuestionView
和QuestionSerializer
。
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'})
答案 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)