如何使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。
添加回答
举报
0/150
提交
取消