【问题标题】:Django REST framework ModelSetView POST not allowed不允许 Django REST 框架 ModelSetView POST
【发布时间】:2021-02-18 04:29:46
【问题描述】:

我正在尝试学习如何使用 Django REST 框架。我想使用 ModelViewSet 制作一个非常简单的 API。我已经关注了文档,但我不清楚 ModelViewSet 在执行router.register(r"polls", QuestionViewSet, basename="polls") 时是否提供从其createPOST 的自动映射

我一直在尝试我的端点:

curl --location --request POST 'http://localhost:8005/polls/' \
--header 'Content-Type: application/json' \
--data-raw '{
    "question_text": "how it do",
    "pub_date": "01-01-2021"
}'

但它返回:{"detail":"Method \"POST\" not allowed."}

型号:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Serailizer 和 ModelViewSet:

class QuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Question
        fields = ["id", "question_text", "pub_date"]

class QuestionViewSet(viewsets.ModelViewSet):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer()

路由器:

from django.conf.urls import re_path, url, include
from django.urls import path
from rest_framework import routers
from .question import QuestionViewSet

router = routers.DefaultRouter()
router.register(r"polls", QuestionViewSet, basename="polls")
urlpatterns = router.urls

【问题讨论】:

    标签: python django api rest django-rest-framework


    【解决方案1】:

    根据此处提供的文档DRF ViewSet Documentation

    您正在使用的ModelViewSetViewSet 的一部分,它提供了各种方法,例如list, create 所以您需要在urls.py 中按照下面的说明使用它

    question_list = QuestionViewSet.as_view({
        'get': 'list',
        'post': 'create'
    })
    

    您的路由器将使用您创建的question_list,如下所示

    urlpatterns = format_suffix_patterns([
        url(r'^polls/$', question_list, name='polls')
    ])
    

    更多详情您也可以参考This Answer

    【讨论】:

    • 我正在尝试在不使用 question_list = QuestionViewSet.as_view({ 'get': 'list', 'post': 'create' }) 的情况下进行设置。我能弄明白。
    【解决方案2】:

    我能够让它工作。 尝试进入 Django Admin 中的 API 视图后 (localhost:8000/api/polls) 我在控制台中收到了一些错误,告诉我我的设置有什么问题。

    第一个变化是这样的: 我尝试调用 QuestionSerializer 类,所以我将其更改为参考

    class QuestionViewSet(viewsets.ModelViewSet):
        queryset = Question.objects.all()
        serializer_class = QuestionSerializer
    

    然后我将路线更改为更简单、更易于阅读的路线

    router = routers.DefaultRouter()
    router.register("polls", QuestionViewSet)
    urlpatterns = router.urls
    

    所以我认为我的主要问题是这种情况下的序列化程序。 我不会依赖 API 调用来显示所有错误,因为内部可能存在错误,如果设置关闭,API 将不会触及。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2021-04-05
      • 2015-09-19
      相关资源
      最近更新 更多