Django Rest Framework - POST-запрос вызывает GET-запрос (localhost) - PullRequest
0 голосов
/ 03 декабря 2018

Когда я пытаюсь получить доступ http://localhost:8000/api/articles/, он работает нормально.

Когда я пытаюсь получить доступ к http://localhost:8000/api/articles/1, он работает нормально.

Когда я пытаюсь получить доступhttp://localhost:8000/api/articles/create Джанго считает, что я пытаюсь выполнить запрос 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'),
]

просмотров.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)

Также, когда я переключаю позиции retrieve и create в шаблонах URL, показанных ниже, я получаю эту ошибку "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'),
]

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Метод Create не поддерживает get action, поэтому вы получаете ошибку {"detail": "Method \"GET\" not allowed."}.В качестве альтернативы вы можете попробовать ModelViewset , который обеспечивает действия по умолчанию create(), retrieve(), update(), partial_update(), destroy() и list().

Либо вы можете создать get_serailzer () метод, с помощью которого вы можете получить доступный для просмотра API с JSON и HTML-формой, с помощью которого вы можете выполнить действие POST.

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)

Изображение API для просмотра с возможностью просмотра

0 голосов
/ 03 декабря 2018

Когда вы пытаетесь с http://localhost:8000/api/articles/create, вы фактически делаете запрос GET .Вот почему вы видите ошибку ("detail": "Method \"GET\" not allowed.".).Если вы хотите сделать почтовый запрос, вам нужно использовать инструменты API, такие как почтальон .Если вы используете почтальона, попробуйте так:

enter image description here

И ваш второй шаблон URL правильный.потому что если вы сохраните <pk>/ до create/, django интерпретирует, что вы вызываете <pk>/ (должен быть <int:pk>) url с аргументом create (который является строкой), когда вы фактически вызываете метод create.И когда он пытается преобразовать его в целое число (так как первичный ключ является автополем), он генерирует исключение invalid literal for int() with base 10: 'create'.

...