前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(项目)生鲜超市(八)

(项目)生鲜超市(八)

作者头像
py3study
发布2020-01-20 11:34:20
6260
发布2020-01-20 11:34:20
举报
文章被收录于专栏:python3python3

九、个人中心

1、drf的api文档生成

  之前配置过文档的url:

1 path('docs',include_docs_urls(title='倍思乐接口文档')),

  然后访问该接口就会自动生成接口文档:

  可以在该文档中做交互和测试,文档可以生成js,shell和python代码段,可以拿来直接使用。

  添加注释,在每个接口的注释中按照ViewSet的格式进行添加注释,比如GoodsListViewSet:

1 class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
2     """
3     list:
4         商品列表,分页,搜索,过滤,排序
5     retrieve:
6         获取商品详情
7     """

  字段的注释有三种添加方式,model的字段中加,serializer的字段加,filter的字段加。

2、个人信息修改

  首先在users/serialziers.py中添加用户详细信息的序列化字段:

1 class UserDetailSerializer(serializers.ModelSerializer):
2     class Meta:
3         model = User
4         fields = ("name", "gender", "birthday", "email", "mobile")

  在个人中心中,想要获取个人信息,只需要在UserViewSet中继承RetrieveModelMixin类:

 1 class UserViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
 2     """用户"""
 3  5     queryset = User.objects.all()
 6 
 7     def create(self, request, *args, **kwargs):
 8         serializer = self.get_serializer(data=request.data)
 9         serializer.is_valid(raise_exception=True)
10 
11         user = self.perform_create(serializer)
12         re_dict = serializer.data
13         payload = jwt_payload_handler(user)
14         re_dict["token"] = jwt_encode_handler(payload)
15         re_dict["name"] = user.name if user.name else user.username
16 
17         headers = self.get_success_headers(serializer.data)
18         return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
19 
20     def perform_create(self, serializer):
21         return serializer.save()

  现在就可以从数据库中获取用户的数据了:

  想要修改个人资料,只需要在UserViewSet接口继承UpdateModelMixin即可:

 1 class UserViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
 2     """用户"""
 3 
 4     # serializer_class = UserRegSerializer
 5     queryset = User.objects.all()
 6     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
 7 
 8     def create(self, request, *args, **kwargs):
 9         serializer = self.get_serializer(data=request.data)
10         serializer.is_valid(raise_exception=True)
11 
12         user = self.perform_create(serializer)
13         re_dict = serializer.data
14         payload = jwt_payload_handler(user)
15         re_dict["token"] = jwt_encode_handler(payload)
16         re_dict["name"] = user.name if user.name else user.username
17 
18         headers = self.get_success_headers(serializer.data)
19         return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
20 
21     # 动态获取权限,注册的时候不应该有权限限制,在获取用户详情的时候,需要有权限登录
22     def get_permissions(self):
23         if self.action == 'retrieve':
24             return [permissions.IsAuthenticated()]
25         elif self.action == 'create':
26             return []
27         return []
28 
29     # 动态选择序列化
30     def get_serializer_class(self):
31         if self.action == "retrieve":
32             return UserDetailSerializer
33         elif self.action == "create":
34             return UserRegSerializer
35         return UserDetailSerializer
36 
37     # 虽然继承了Retrieve可以获取用户详情,但是并不知道用户的id,所有要重写get_object方法
38     def get_object(self):
39         return self.request.user
40 
41     def perform_create(self, serializer):
42         return serializer.save()

  现在修改个人资料,修改成功:

3、用户收藏商品详情

  在user_operation/serializers.py中添加用户收藏详情的序列化:

1 class UserFavDetailSerializer(serializers.ModelSerializer):
2     # 通过商品id获取收藏的商品,需要嵌套商品的序列化
3     goods = GoodsSerializer()
4 
5     class Meta:
6         model = UserFav
7         fields = ("goods", "id")

  在UserFavViewSet接口中动态获取收藏序列化:

 1 class UserFavViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin,
 2                      mixins.RetrieveModelMixin, viewsets.GenericViewSet):
 3     """用户收藏"""
 4 
 5     # permission是权限验证 IsAuthenticated必须登录用户 IsOwnerOrReadOnly必须是当前登录的用户
 6     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
 7 
 8     # authentication是用户认证
 9     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
10 
11     # 搜索的字段
12     lookup_field = 'goods_id'
13 
14     # 动态选择serializer
15     def get_serializer_class(self):
16         if self.action == "list":
17             return UserFavDetailSerializer
18         elif self.action == "create":
19             return UserFavSerializer
20         return UserFavSerializer
21 
22     # 只能查看当前登录用户的收藏,不会获取所有用户的收藏
23     def get_queryset(self):
24         return UserFav.objects.filter(user=self.request.user)

  可以在个人中心我的收藏看到收藏的商品及商品详情,还可以删除收藏。

 4、用户留言功能

  在serializers.py中添加用户留言的序列化字段:

 1 class LeavingMessageSerializer(serializers.ModelSerializer):
 2     user = serializers.HiddenField(
 3         default=serializers.CurrentUserDefault()
 4     )
 5     # read_only:只返回,post时候可以不用提交
 6     add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M')
 7 
 8     class Meta:
 9         model = UserLeavingMessage
10         fields = ("user", "message_type", "subject", "message", "file", "id", "add_time")

  然后在views.py中编写用户留言的接口:

 1 class LeavingMessageViewSet(mixins.ListModelMixin, mixins.DestroyModelMixin, mixins.CreateModelMixin,
 2                             viewsets.GenericViewSet):
 3     """
 4     list:
 5         获取用户留言
 6     create:
 7         添加留言
 8     delete:
 9         删除留言功能
10     """
11 
12     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
13     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
14     serializer_class = LeavingMessageSerializer
15 
16     # 获取自己的留言
17     def get_queryset(self):
18         return UserLeavingMessage.objects.filter(user=self.request.user)

  注册url:

1 router.register(r'messages', LeavingMessageViewSet, base_name='messages')  # 用户留言

5、用户收货地址

  在serializers.py中对收货地址所需的字段进行序列化:

1 class AddressSerializer(serializers.ModelSerializer):
2     user = serializers.HiddenField(
3         default=serializers.CurrentUserDefault()
4     )
5     add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M')
6 
7     class Meta:
8         model = UserAddress
9         fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")

  然后在views.py中编写收货地址的接口,这里直接继承ModelViewSet即可,它将增删改查全部集中在了一起:

 1 class AddressViewSet(viewsets.ModelViewSet):
 2     """
 3     收货地址管理
 4     list:
 5         获取收货地址
 6     create:
 7         添加收货地址
 8     update:
 9         更新收货地址
10     delete:
11         删除收货地址
12     """
13 
14     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
15     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
16     serializer_class = AddressSerializer
17 
18     def get_queryset(self):
19         return UserAddress.objects.filter(user=self.request.user)

  注册url:

1 router.register(r'address',AddressViewSet , base_name="address")  # 收货地址
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 九、个人中心
    • 1、drf的api文档生成
      • 2、个人信息修改
        • 3、用户收藏商品详情
          •  4、用户留言功能
            • 5、用户收货地址
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档