有下一个 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_route
或 list_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
关于python - 如何在 Django REST 中实现方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519881/