【问题标题】:DJANGO: mixins.DestroyModelMixin delete - method not allowedDJANGO:mixins.DestroyModelMixin 删除 - 方法不允许
【发布时间】:2020-09-02 03:32:18
【问题描述】:

我有一个返回所有喜欢列表的 API。

这是喜欢的模型:

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'post'], name='like_once')
        ]

这是我的看法:

class likeList(mixins.CreateModelMixin, mixins.DestroyModelMixin, generics.ListAPIView):
    serializer_class = likeserializers

    def get_queryset(self):
        return Like.objects.all()

    def post(self, request, *args, **kwargs):
        try:
            return self.create(request, *args, **kwargs)
        except IntegrityError:
            content = {'error': 'IntegrityError'}
            return Response(content, status=status.HTTP_400_BAD_REQUEST)

    def destroy(self, request, *args, **kwargs):
        try:
            return self.destroy(request, *args, **kwargs)
        except IntegrityError:
            content = {'error': 'IntegrityError'}
            return Response(content, status=status.HTTP_400_BAD_REQUEST)

这是我的网址:

from django.conf import settings
from django.conf.urls.static import static
from django.urls import path
from . import views as API_views

urlpatterns = [
    path('users/', API_views.userList.as_view(), name = 'users'),
    path('users/id=<int:id>/', API_views.userListbyID.as_view(), name = 'usersid'),
    path('posts/', API_views.postList.as_view(), name = 'post'),
    path('posts/id=<int:id>', API_views.postListbyID.as_view(), name = 'postid'),
    path('likes/', API_views.likeList.as_view(), name = 'likes'),
    path('likes/test/<int:id>', API_views.likeListbyID.as_view(), name = 'likesid'),
    path('likes/<int:id>', API_views.LikeCountView.as_view(), name='likecount'),
    path('follows/', API_views.followList.as_view(), name = 'follows'),
    path('follows/id=<int:id>', API_views.followListbyID.as_view(), name = 'followsid'),
]

如果设置.DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.MEDIA_URL)

我用json body {"user":userid,"post":postid}调用delete api

但是,我收到了不允许的方法 (HTTP 405)。我还可以在 API 页面上看到“允许:GET、POST、HEAD、OPTIONS”

我做错了什么?

仅供参考:get 和 create 方法按预期工作。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您需要为这些操作使用两个不同的视图。 List 和 Create mixin 不需要对象 pk,但 Destroy mixin 需要。您需要将 Destroy mixin 拆分到另一个视图中,如 docs 中所采样的那样。如果不提供 pk 删除,则操作失败。

    【讨论】:

    • 我试过了,但后来我收到一个错误“AssertionError: Expected view likeList to be called with a URL keyword argument named “pk”。修复你的 URL conf,或者设置 .lookup_field 属性正确查看。”你认为用 pk 设置 API 会更好吗?
    • 你能分享你的 urls.py 内容吗?我猜那个文件有错误。
    • 将网址添加到主帖
    • 我已经更新了我的答案,您需要将它们分成两个单独的视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2021-09-23
    • 2014-06-21
    • 1970-01-01
    • 2013-12-25
    • 2014-12-29
    相关资源
    最近更新 更多