Django Rest Framework 电商项目 8-3 用户收藏接口实现

时间:2019-02-16
本文章向大家介绍Django Rest Framework 电商项目 8-3 用户收藏接口实现,主要包括Django Rest Framework 电商项目 8-3 用户收藏接口实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在user_operation中实现。

在views.py中:

from rest_framework import viewsets
from rest_framework import mixins
class UserFavViewSet(mixins.CreateModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):

然后新建一个serializers.py,编写:

from rest_framework import serializers

from .models import UserFav
class UserFavSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )  # 获取当前用户,drf文档中看用法,如果不这样,post的时候还需要传用户,这是不合理的

    class Meta:
        model = UserFav
        fields = ("user", "goods", "id")  # id是为了删除操作

回到views.py:

from .serializers import UserFavSerializer
from .models import UserFav

为UserFavViewset添加一定的逻辑:

queryset = UserFav.objects.all()
serializer_class = UserFavSerializer

配置url:

from user_operation.views import UserFavViewSet
router.register(r'userfavs', UserFavViewSet, base_name="userfavs")

进行测试。

实际上,UserFavViewset可以再继承一个:

mixins.ListModelMixin

来获取用户的所有收藏。.

测试。发现post后仅展示了goods的id。但我们还想得到goods更多的字段,这个之后再说。

下面开发取消收藏的功能。

可以用postman试一试(也可以drf后端删除,输入下面的url然后点击delete),用delete方法,url是

http://127.0.0.1:8000/userfavs/id/

但实际上这还不够严谨,主要是收藏的时候我们应该先看看是否已经有这条记录。

在models.py中的UserFav中的Meta中添加:

unique_together = ("user", "goods")

这里面的字段就做了一个联合唯一索引,这是django的ORM,会映射到数据库中,数据库帮我们完成。

先清空收藏表,再执行:

makemigrations
migrate

可以用Navicat点击设计表,然后选择索引查看。

测试,发现重复收藏报错。

实际上我们还可以用drf提供的UniqueTogetherValidator来完成。现在已经能完成是因为serializer继承的是ModelSerializer,与model直接相关,它会找到model中相关的设置。

看文档,我们可以在serializer.py中:

from rest_framework.validators import UniqueTogetherValidator

在Meta中添加:

validators = [
            UniqueTogetherValidator(
                queryset=UserFav.objects.all(),
                fields=('user', 'goods'),
                message="已经收藏"
            )
        ]

对比之前的validator,这个是写在meta中的,而不像之前是写在某一个字段上的了。因为它是多个字段的验证。

再测试,看看变化(错误提示消息变得友好了)。