python - 如何在 Django REST 中实现方法?

标签 python django django-rest-framework

有下一个 Django REST 问题。

我有意见。

class MessageViewSet(viewsets.ModelViewSet):
    serializer_class = MessageSerializer
    queryset = Message.objects.filter(isread = False)
    def mark_read():
        queryset = Message.objects.update(isread=True)
        return Response({'read':queryset})

和 urls.py 中的路由器

router = SimpleRouter() router.register(r'api/get_messages', MessageViewSet)

urlpatterns = [
    url(r'^$', MainView.as_view(), name='main'),
    url(r'^', include(router.urls)) ]

现在我有了显示所有列表的“get_messages”页面。

当我访问“mark_read”页面时,如何实现一种方法将模型实例的“isread”值从 False 更改为 True? 如您所见,我试图在类里面编写方法。但是当我试图以这种方式在 url 中调用它时:

router.register(r'api/mark_read', MessageViewSet.mark_read),

这里出现错误。

assert queryset is not None, 'base_name argument not specified, and could ' \ AssertionError: base_name argument not specified, and could not automatically determine the name from the viewset, as it does not have a .queryset attribute.

也许我不应该使用路由器,并以其他方式重写 View 和 url。如果你知道如何解决这个问题,请回答。谢谢。

最佳答案

您可以使用 detail_routelist_route 装饰器。

from rest_framework.decorators import list_route

class MessageViewSet(viewsets.ModelViewSet):

    @list_route()
    def mark_read(self, request):
        queryset = Message.objects.update(isread=True)
        return Response({'read':queryset})

mark_read 方法将在 api/get_messages/mark_read 中可用。而且您不需要创建单独的路由器,只需使用您为 MessageViewSet

创建的路由器

docs reference

关于python - 如何在 Django REST 中实现方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519881/

相关文章:

python - 杰通 2.5.1 : "ImportError: No Module named os"

python - 在 pandas 中找到 groupby 后百分比总和的差异

python - 将 mongoengine.connect 从 django 中的 setting.py 中取出

python - 上传 django rest framework api 时文件(pdf 除外)损坏

python - django-rest-framework ManyToManyField 创建和更新

python - 在 Python 中使用 CSS 的轻量级渲染器 HTML

用于设置 Django 应用程序的 python 路径

python - 为什么django项目中的__init__模块加载了两次

Django Rest Framework JWT 身份验证测试

python - 如何从 rest_framework.test.Client 指定接受 header ?