5.商品详情页、收藏接口与权限验证

1.商品详情页

 1 # goods/views.py 对应的类中继承RetrieveModelMixin,从而实现根据ID查询到某条记录
 2 ...
 3 class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
 4 ...
 5 
 6 # goods/serializers.py 添加轮播图
 7 ...
 8 class GoodsImageSerializer(serializers.ModelSerializer):
 9     class Meta:
10         model = GoodsImage
11         fields = ("image",)
12 
13 class GoodsSerializer(serializers.ModelSerializer):
14     ...
15     images = GoodsImageSerializer(many=True)
16     ....

2.热卖商品接口实现

1 # goods/filters.py    添加 is_hot
2 ...
3 class GoodsFilter(django_filters.FilterSet):
4    ...
5     class Meta:
6         model = Goods
7         fields = ['pricemin', 'pricemax', 'name', 'is_hot']

3.用户收藏接口实现

     简单实现

 1 # user_operation/views.py
 2 from rest_framework import mixins, viewsets
 3 from .models import UserFav
 4 from .serializers import UserFavSerializer
 5 
 6 class UserFavViewset(mixins.CreateModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
 7     queryset = UserFav.objects.all()
 8     serializer_class = UserFavSerializer
 9 
10 # user_operation/serializers.py
11 from rest_framework import serializers
12 from .models import UserFav
13 
14 class UserFavSerializer(serializers.ModelSerializer):
15     class Meta:
16         model = UserFav
17         fields = ['user', 'goods', 'id']
18 
19 # urls.py
20 ...
21 from user_operation.views import UserFavViewset
22 ...
23 # 配置用户收藏
24 router.register(r'userfavs', UserFavViewset, base_name='userfavs')
25 ...

    不需要输入用户,默认为当前登录用户:

1 # user_operation/serializers.py
2 ...
3 class UserFavSerializer(serializers.ModelSerializer):
4     user = serializers.HiddenField(
5         default=serializers.CurrentUserDefault()
6     )
7     class Meta:
8         ...

    获取收藏列表:

1 # user_operation/views.py
2 ...
3 class UserFavViewset(..., mixins.ListModelMixin, ...): 
4 ...

    设置user与good唯一索引:

 1 # 方法一:在数据表中设计
 2 # user_operation/models.py
 3 class UserFav(models.Model):
 4     ...
 5     class Meta:
 6         ...
 7         unique_together = ("user", "goods")
 8     ...
 9 
10 # 方法二:在serializers.py中设置
11 # user_operation/serializers.py
12 ...
13 class UserFavSerializer(serializers.ModelSerializer):
14     ...
15     class Meta:
16         validators = [
17             UniqueTogetherValidator(
18                 queryset=UserFav.objects.all(),
19                 fields=('user', 'goods'),
20                 message='已收藏',
21             )
22         ]
23         ...

4.drf的权限验证

     用户登录后才能操作:

1 # user_operation/views.py
2 ...
3 from rest_framework.permissions import IsAuthenticated
4 ...
5 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
6     ...
7     permission_classes = (IsAuthenticated,)
8 ...

    只能查看和操作自己的收藏

 1 # utils/permissions.py
 2 from rest_framework import permissions
 3 
 4 class IsOwnerOrReadOnly(permissions.BasePermission):
 5     """
 6     Object-level permission to only allow owners of an object to edit it.
 7     Assumes the model instance has an `owner` attribute.
 8     """
 9 
10     def has_object_permission(self, request, view, obj):
11         # Read permissions are allowed to any request,
12         # so we'll always allow GET, HEAD or OPTIONS requests.
13         if request.method in permissions.SAFE_METHODS:
14             return True
15 
16         # Instance must have an attribute named `owner`.
17         return obj.user == request.user
18 
19 # user_operations/views.py
20 ...
21 from utils.permissions import IsOwnerOrReadOnly
22 ...
23 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
24     # queryset = UserFav.objects.all()
25     ...
26     permission_classes = (..., IsOwnerOrReadOnly)
27 
28     def get_queryset(self):
29         return UserFav.objects.filter(user=self.request.user)

     JWT授权

1 # user_opeartion/views.py
2 ...
3 from rest_framework.authentication import SessionAuthentication
4 from rest_framework_jwt.authentication import JSONWebTokenAuthentication
5 ...
6 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
7     ...
8     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication,)
9 ...

5.用户收藏功能和vue联调

    删除用户收藏时,传送过来的是good的id。UserFav表结构为:id、add_time、goods_id、user_id。此时good的id直接对应UserFav表中的id,是不正确的。正确的应该是对应到goods_id上。此时我们引入lookup_field,作用:改变默认的{PK}

1 # user_opeartion/views.py
2 ...
3 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
4    ...
5     lookup_field = 'goods_id'
6     def get_queryset(self):
7     ...

 

posted @ 2018-01-26 10:08  KD-VS-WB  阅读(275)  评论(0)    收藏  举报