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中的,而不像之前是写在某一个字段上的了。因为它是多个字段的验证。
再测试,看看变化(错误提示消息变得友好了)。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 传说中的画图神器Plotnine,Python中的ggplot2
- 用ORCA做结构优化及轨迹查看
- 前端兼容之痛
- 离线安装PySCF程序(1.5及更高版本)
- Python Debug(调试)的终极指南
- Linux下做计算常用的别名alias推荐
- 离线安装支持Intel MKL的R-3.6
- Dalton使用——磷光及其相关过程
- 【赵渝强老师】Flink的Watermark机制(基于Flink 1.11.0实现)
- 在Windows CMD里“使用”常见Linux命令
- 什么是Python中的Dask,它如何帮助你进行数据分析?
- a[i] = i++ 到底对不对?
- 如何监视Python程序的内存使用情况
- df -h和du -sh看到的硬盘使用不相等?
- MyBatis 中的一级和二级缓存