【问题标题】:Django REST framework: type object X has no attribute 'get_extra_actions'Django REST 框架:类型对象 X 没有属性“get_extra_actions”
【发布时间】:2019-05-09 05:44:29
【问题描述】:

Ubuntu LTS、Python 3.6.x、Django 2.2.1、DRF 3.9.3

我从 DRF 快速入门开始。工作正常。

跳入DRF tutorial, step 3 on using generic class based views 尝试manage.py runserver 时出现此错误

File "/home/ubuntu/src/rasi/rais/instances/urls.py", line 11, in <module>
    path('api/', include(router.urls)),
  File "/home/ubuntu/.virtualenv/managed-research-prod/lib/python3.6/site-packages/rest_framework/routers.py", line 125, in
urls
    self._urls = self.get_urls()
  File "/home/ubuntu/.virtualenv/managed-research-prod/lib/python3.6/site-packages/rest_framework/routers.py", line 386, in
get_urls
    urls = super(DefaultRouter, self).get_urls()
  File "/home/ubuntu/.virtualenv/managed-research-prod/lib/python3.6/site-packages/rest_framework/routers.py", line 284, in
get_urls
    routes = self.get_routes(viewset)
  File "/home/ubuntu/.virtualenv/managed-research-prod/lib/python3.6/site-packages/rest_framework/routers.py", line 200, in
get_routes
    extra_actions = viewset.get_extra_actions()
AttributeError: type object 'InstanceList' has no attribute 'get_extra_actions'

为了实施本教程的建议,我只对我的代码库进行了最小的更改。

我做错了什么并不明显,当我阅读 ListCreateAPIView 指南时,关于 get_extra_actions 的信息并不多,在其他地方看起来也没有明显可比性

urls.py

from django.urls import include, path
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'users',views.UserViewSet)
router.register(r'instances',views.InstanceList)                                                                            

urlpatterns = [ 
    path('', views.dash, name='dash'),
    path('api/', include(router.urls)),
]

models.py

class User(AbstractUser):
    email = models.EmailField()
    dept = models.CharField(max_length=400)
    display_name = models.CharField(max_length=200)

class Instance(models.Model):
    name = models.CharField(max_length=200)
    flavour = models.CharField(choices=FLAVOUR_CHOICES, max_length=20)
    os = models.IntegerField(choices=OS_CHOICES)
    hostname = models.CharField(max_length=200)
    allocation_manager = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        blank=True,
        null=True,
        on_delete=models.SET_NULL,
        related_name='manager')
    allocation_notes = models.TextField(blank=True,null=True)
    requested_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        blank=True,
        null=True,
        on_delete=models.SET_NULL,
        related_name='requestor')

serializer.py

# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):                                                               
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'is_staff')

class InstanceSerializer(serializers.HyperlinkedModelSerializer):
    allocation_manager = UserSerializer()
    requested_by = UserSerializer()

    class Meta:
        model = Instance
        fields = ('name', 'flavour', 'hostname', 'allocation_manager','requested_by')

views.py

# Serializer Views
# ViewSets define the view behavior.

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class InstanceList(generics.ListCreateAPIView):
    queryset = Instance.objects.all()
    serializer_class = InstanceSerializer

注意/编辑:我找到了some questions, but few solutions

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    基本上,您正在尝试向路由器注册一个非视图集(此处为InstanceList 视图,而不是视图集)。取而代之的是,您可以像这样在 url 中简单地使用它:

    router = routers.DefaultRouter()
    router.register(r'users',views.UserViewSet)                                                                         
    
    urlpatterns = [ 
        path('', views.dash, name='dash'),
        path('api/', include(router.urls)),
        path('api/instances/', views.InstanceList.as_view(), name="instances"),
    ]
    

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2017-06-17
      • 2018-03-30
      • 2017-08-11
      • 2016-06-30
      • 2021-04-28
      相关资源
      最近更新 更多