6.动态设置serializer和permission、个人中心修改(用户信息、收藏、留言、收货)

1.drf的api文档自动生成和功能详解

 1 # urls.py
 2 ...
 3 urlpatterns = [
 4     ...
 5     url(r'docs/', include_docs_urls(title='接口说明')),
 6 ]
 7 ...
 8 
 9 # 访问报错“UnicodeDecodeError at /docs/”,解决如下:
10 # settings.py
11 reload(sys)
12 sys.setdefaultencoding('utf8')

    具体使用参考:http://www.django-rest-framework.org/topics/documenting-your-api/

2.动态设置serializer和permission获取用户信息

 1 # users/serializers.py
 2 ...
 3 class UserDetailSerializer(serializers.ModelSerializer):
 4     class Meta:
 5         model = User
 6         fields = ('id', 'name', 'mobile', 'birthday', 'gender')
 7 ...
 8 
 9 # users/views.py
10 # 动态设置serializer 与 permission
11 ...
12 # CreateModelMixin:创建数据;UpdateModelMixin:更新数据;RetrieveModelMixin:获取某条数据
13 class UserViewset(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, viewsets.GenericViewSet):
14     # serializer_class = UserRegSerializer
15     queryset = User.objects.all()
16 
17     # 动态定义serializer_class
18     def get_serializer_class(self):
19         if self.action == 'create':
20             return UserRegSerializer
21         return UserDetailSerializer
22 
23     # 动态定义权限
24     def get_permissions(self):
25         if self.action == 'retrieve':
26             return [IsAuthenticated(),]
27         return []
28 
29     # 自定义返回的信息
30     def get_object(self):
31         return self.request.user

 3.用户收藏功能

 1 # user_operation/serializers.py
 2 ...
 3 from goods.serializers import GoodsSerializer
 4 from .models import UserFav
 5 
 6 class UserFavDetailSerializer(serializers.ModelSerializer):
 7     goods = GoodsSerializer()
 8     class Meta:
 9         model = UserFav
10         fields = ['goods', 'id']
11 ...
12 
13 # 动态设置serializers
14 # user_operation/views.py
15 ...
16 from .serializers import UserFavSerializer, UserFavDetailSerializer
17 
18 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
19     ...
20     # serializer_class = UserFavSerializer
21     ...
22     def get_serializer_class(self):
23         if self.action == "list":
24             return UserFavDetailSerializer
25         elif self.action == 'create':
26             return UserFavSerializer
27         return UserFavSerializer

4.用户留言功能

 1 # user_operation/serializers.py
 2 ...
 3 from .models import UserFav, UserLeavingMessage, UserAddress
 4 
 5 class LeavingMessageSerializer(serializers.ModelSerializer):
 6     # 设置为当前用户
 7     user = serializers.HiddenField(
 8         default=serializers.CurrentUserDefault()
 9     )
10     # 格式化输出
11     add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M')
12     class Meta:
13         model = UserLeavingMessage
14         fields = ['id', 'user', 'message_type', 'subject', 'message', 'file', 'add_time']
15     ...
16 
17 # user_operation/views.py
18 ...
19 from .serializers import UserFavSerializer, UserFavDetailSerializer, LeavingMessageSerializer, AddressSerializer
20 ...
21 class LeavingMessageViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
22     '''
23     用户留言管理
24     list:
25         获取用户留言
26     create:
27         创建用户留言
28     update:
29         删除用户留言
30     delete
31     '''
32     serializer_class = LeavingMessageSerializer
33     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
34     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication,)
35 
36     # 只获取当前用户的数据
37     def get_queryset(self):
38         return UserLeavingMessage.objects.filter(user=self.request.user)
39     ...
40 
41 # urls.py
42 # 配置用户留言
43 router.register(r'messages', LeavingMessageViewset, base_name='messages')

5.用户收货地址功能

 1 # user_operation/serializers.py
 2 ...
 3 from .models import UserFav, UserLeavingMessage, UserAddress
 4 
 5 class AddressSerializer(serializers.ModelSerializer):
 6     # 设置为当前用户
 7     user = serializers.HiddenField(
 8         default=serializers.CurrentUserDefault()
 9     )
10     class Meta:
11         model = UserAddress
12         fields = ['id', 'user', 'province', 'city', 'district', 'address', 'signer_name', 'signer_mobile', 'add_time']
13     ...    
14     
15 # user_operation/views.py
16 ...
17 from .serializers import UserFavSerializer, UserFavDetailSerializer, LeavingMessageSerializer, AddressSerializer
18 
19 class AddressViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
20     '''
21     收货地址管理
22     list:
23         获取收货地址
24     create:
25         创建收货地址
26     update:
27         更新收货地址
28     partial_update:
29         更新收货地址
30     delete:
31         删除收货地址
32     '''
33     serializer_class = AddressSerializer
34     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
35     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication,)
36 
37     # 只获取当前用户的数据
38     def get_queryset(self):
39         return UserAddress.objects.filter(user=self.request.user)
40     ...
41 
42 # urls.py
43 # 配置用户收货地址
44 router.register(r'address', AddressViewset, base_name='address')
posted @ 2018-01-29 11:11  KD-VS-WB  阅读(369)  评论(0)    收藏  举报