dat*_*kid 5 python django django-rest-framework
Ubuntu LTS,Python 3.6.x,Django 2.2.1,DRF 3.9.3
我从DRF快速入门开始。很好
跳至DRF教程,有关使用基于通用类的视图的第3步,尝试时遇到此错误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'
Run Code Online (Sandbox Code Playgroud)
为了实现本教程中的建议,我仅对代码库进行了最小的更改。
我做错了什么不是很明显,get_extra_actions当我阅读ListCreateAPIView指南时,周围没有很多信息,在其他地方看起来也没有很多可比性
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)),
]
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
序列化器
# 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')
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
注意/编辑:我发现了一些问题,但解决方案很少。
rud*_*dra 10
基本上,您正在尝试InstanceList向路由器注册非视图集(此处是视图,而不是视图集)。取而代之的是,您可以仅在如下网址中使用它:
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"),
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |