使用ModelViewSet和ModelSerializer 405的Django POST

如何使ModelViewSet接受POST方法创建对象?当我尝试呼叫端点时,我得到405 'Method "POST" not allowed.'。


在views.py中:


class AccountViewSet(viewsets.ModelViewSet):

    """An Account ModelViewSet."""


    model = Account

    serializer_class = AccountSerializer

    queryset = Account.objects.all().order_by('name')

在serializers.py中:


class AccountSerializer(serializers.ModelSerializer):

    name = serializers.CharField(required=False)

    active_until = serializers.DateTimeField()


    class Meta:

        model = Account

        fields = [

            'name',

            'active_until',

        ]


    def create(self, validated_data):

        with transaction.atomic():

            Account.objects.create(**validated_data)

在urls.py中:


from rest_framework import routers


router = routers.SimpleRouter()

router.register(

    prefix=r'v1/auth/accounts',

    viewset=AccountViewSet,

    base_name='accounts',

)

我需要创建一个特定的@action?我这样做的尝试尚未成功。如果是url = reverse('app:accounts-<NAME>')这样的话,我可以从测试中调用它吗?我还没有找到完整的示例(urls.py,views.py,serializers.py和测试等)。


哈士奇WWW
浏览 181回答 2
2回答

largeQ

我发现了问题所在,路线有冲突。在AccountViewSet之前注册了一个更高级别的终结点。router.register(&nbsp; &nbsp; prefix=r'v1/auth',&nbsp; &nbsp; viewset=UserViewSet,&nbsp; &nbsp; base_name='users',)router.register(&nbsp; &nbsp; prefix=r'v1/auth/accounts',&nbsp; &nbsp; viewset=AccountViewSet,&nbsp; &nbsp; base_name='accounts',)Django按顺序运行每个URL模式,并在与请求的URL匹配的第一个URL模式处停止。。我应该这样被命令的:router.register(&nbsp; &nbsp; prefix=r'v1/auth/accounts',&nbsp; &nbsp; viewset=AccountViewSet,&nbsp; &nbsp; base_name='accounts',)router.register(&nbsp; &nbsp; prefix=r'v1/auth',&nbsp; &nbsp; viewset=UserViewSet,&nbsp; &nbsp; base_name='users',)尽管事实reverse('appname:acccounts-list')可行,但底层URL路由器仍然认为我正在调用UserViewSet。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python