django中def不起作用

我定义了一个类,里面有一个get方法,当用户用get方法发送请求时,会执行这个方法(主要就是从数据可里面取出数据,然后进行一些修改再发给前端)。可是我试了一下,当用户发起get请求时,只会执行

queryset = Product.objects.all()
serializer_class = ProductSerializer

get的方法都没有执行,请问是怎么回事

## urls.py
router.register(r'getList', ProductListViewset)
## views.py

class ProductListViewset(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

    def get(self, request, format=None):
        serializer = ProductSerializer
        data = serializer.data
        username = data.get('user_name')
        user = User.objects.get(username__exact=username)
        new_data = {
            'id': data.get('id'),
            'user_name': data.get('user_name'),
            'user_image_URL': user.get('user_image_URL'),
            'c_time': data.get('c_time'),
            'goods_price': data.get('goods_price'),
            'title': data.get('title'),
            'description': data.get('description')
        }
        return Response(new_data, 200)
阅读 2.5k
1 个回答

这个你要详细看一下 restfulframework的框架文档。

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass

在modelviewset中已经封装好了各种http请求方法所对应的action的匹配,
而具体的匹配的规则就定义在routers模块的SimpleRouter类中

class SimpleRouter(BaseRouter):

    routes = [
        # List route.
        Route(
            url=r'^{prefix}{trailing_slash}$',
            mapping={
                'get': 'list',
                'post': 'create'
            },
            name='{basename}-list',
            detail=False,
            initkwargs={'suffix': 'List'}
        ),
        # Dynamically generated list routes. Generated using
        # @action(detail=False) decorator on methods of the viewset.
        DynamicRoute(
            url=r'^{prefix}/{url_path}{trailing_slash}$',
            name='{basename}-{url_name}',
            detail=False,
            initkwargs={}
        ),
        # Detail route.
        Route(
            url=r'^{prefix}/{lookup}{trailing_slash}$',
            mapping={
                'get': 'retrieve',
                'put': 'update',
                'patch': 'partial_update',
                'delete': 'destroy'
            },
            name='{basename}-detail',
            detail=True,
            initkwargs={'suffix': 'Instance'}
        ),
        # Dynamically generated detail routes. Generated using
        # @action(detail=True) decorator on methods of the viewset.
        DynamicRoute(
            url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$',
            name='{basename}-{url_name}',
            detail=True,
            initkwargs={}
        ),
    ]

所以说回到你的问题,其实框架已经默认提供了路由以及action,你要做的是覆盖mixin中的方法来实现自定义(也就是自己的业务逻辑)

router = SimpleRouter()
router.register('product', ProductViewset)
# 这里注册了ProductViewset,会默认添加所有的restful路由
# 所以你的viewset里应该是 def list()
# 这个是默认ListModelMixin的list方法,你可以学习一下他的写法

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

另外,从上面的code来看,
我觉得你对restfulframework并没有理解,
我建议你跟着官网上的例子,逐步学习,学习过程中问题再提出来,大家一起看。
https://www.django-rest-frame...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题