当我尝试访问http://localhost:8000/api/articles/时,效果很好。
当我尝试访问http://localhost:8000/api/articles/1时,效果很好。
当我尝试访问http://localhost:8000/api/articles/create时,Django认为我正在尝试执行GET请求('get': 'retrieve'
)。我在做什么错了?
错误 invalid literal for int() with base 10: 'create'
urls.py
urlpatterns = [
path('', ArticleViewSet.as_view({'get': 'list'}), name='list'),
path('<pk>/', ArticleViewSet.as_view({'get': 'retrieve'}), name='detail'),
path('create/', ArticleViewSet.as_view({'post': 'create'}) ,name='create'),
]
views.py
class ArticleViewSet(ViewSet):
queryset = Article.objects.all()
def list(self, request):
articles = query_filter(request, ArticleViewSet.queryset)
serializer = ArticleSerializer(articles, many=True)
articles = formatter(serializer.data)
return Response(articles)
def retrieve(self, request, pk=None):
article = get_object_or_404(ArticleViewSet.queryset, pk=pk)
serializer = ArticleSerializer(article, many=False)
article = formatter([serializer.data])
return Response(article)
def create(self, request):
articles = ArticleViewSet.queryset
articles.create(title=request.data['title'], body=request.data['body'])
article = articles.last()
serializer = ArticleSerializer(article, many=False)
article = formatter([serializer.data])
return Response(article)
另外,当我在如下所示的urlpatterns中切换retrieve
和create
的位置时,也会收到此错误"detail": "Method \"GET\" not allowed."
。
urlpatterns = [
path('', ArticleViewSet.as_view({'get': 'list'}), name='list'),
path('create/', ArticleViewSet.as_view({'post': 'create'}), name='create'),
path('<pk>/', ArticleViewSet.as_view({'get': 'retrieve'}), name='detail'),
]
答案 0 :(得分:2)
尝试使用http://localhost:8000/api/articles/create
时,实际上是在发出GET请求。这就是为什么您看到错误("detail": "Method \"GET\" not allowed.".
)的原因。如果要发出发布请求,则需要使用postman之类的api工具。如果您使用邮递员,请尝试以下操作:
您的第二个网址格式正确。因为如果您将<pk>/
放在create/
之前,则django会解释您正在使用参数<pk>/
(是字符串)调用<int:pk>
(应为create
)url。 ,当您实际调用create方法时。并且当它尝试将其转换为整数(因为主键是一个自动字段)时,它抛出invalid literal for int() with base 10: 'create'
异常。
答案 1 :(得分:1)
Create方法不支持get操作,这就是您收到错误{"detail": "Method \"GET\" not allowed."}
的原因。或者,您可以尝试 ModelViewset ,它提供默认的create()
,retrieve()
,update()
,partial_update()
,destroy()
和list()
动作。
您可以创建 get_serailzer()方法,使用该方法可以通过POST操作获得具有JSON和HTML格式的可浏览API。
class ArticleViewSet(viewsets.ViewSet):
queryset = Article.objects.all()
def get_serializer(self, *args, **kwargs):
return ArticleSerializer(*args, **kwargs)
def create(self, request, *args, **kwargs):
articles = ArticleViewSet.queryset
articles.create(title=request.data['title'], body=request.data['body'])
article = articles.last()
**serializer = self.get_serializer(article, many=False)**
from pyreadline.logger import formatter
article = formatter([serializer.data])
return Response(article)