为了账号安全,请及时绑定邮箱和手机立即绑定

使用ModelViewSet和ModelSerializer 405的Django POST

使用ModelViewSet和ModelSerializer 405的Django POST

哈士奇WWW 2021-05-08 14:12:10
如何使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 routersrouter = 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和测试等)。
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

我发现了问题所在,路线有冲突。在AccountViewSet之前注册了一个更高级别的终结点。


router.register(

    prefix=r'v1/auth',

    viewset=UserViewSet,

    base_name='users',

)


router.register(

    prefix=r'v1/auth/accounts',

    viewset=AccountViewSet,

    base_name='accounts',

)

Django按顺序运行每个URL模式,并在与请求的URL匹配的第一个URL模式处停止。。我应该这样被命令的:


router.register(

    prefix=r'v1/auth/accounts',

    viewset=AccountViewSet,

    base_name='accounts',

)


router.register(

    prefix=r'v1/auth',

    viewset=UserViewSet,

    base_name='users',

)

尽管事实reverse('appname:acccounts-list')可行,但底层URL路由器仍然认为我正在调用UserViewSet。


查看完整回答
反对 回复 2021-05-11
  • 2 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信