个人收藏

整体逻辑类似于 个人中心 ( 个人中心的相关逻辑梳理详情  点击这里 )

也是两个序列化组价的分流

查看收藏  ( list ) 详情指向 收藏详情 的组价

创建收藏 ( create ) 指向 用户收藏 的组件

序列化组件

收藏详情需要用到收藏的商品全部内容, 序列化的时候需要进行组件的嵌套, 将商品序列化组件嵌进去

# 收藏详情
class UserFavDetailSerializer(serializers.ModelSerializer):
goods = GoodsSerializer(many=True) class Meta:
model = UserFav
fields = ("goods", "id")

收藏的时候需要注意设置一个联合唯一索引, 在序列化中设置后或者 models 中设置皆可

# 用户收藏
class UserFavSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
) class Meta:
model = UserFav
# 联合唯一可以在 model 中创建的时候进行操作, 通过 ModelSerializer 自然会帮你完成验证
# 也可以在这里完成, 注意是在 Meta 中进行设置, 因为这是多字段的处理
validators = [
UniqueTogetherValidator(
queryset=UserFav.objects.all(),
fields=('user', 'goods'),
message="已经收藏过了"
)
]
fields = ("user", "goods", "id") # 删除的需要因此加上 id, 这样方便删除操作

视图

整体逻辑类似于个人中心

依旧是 分流处理序列化组件, 因为收藏功能的全部请求都需要在用户登录下查看

因此不需认证分流

# 用户收藏功能
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
mixins.DestroyModelMixin, viewsets.GenericViewSet):
"""
list:
获取用户收藏列表
retrieve:
判断某个商品是否已经收藏
create:
收藏商品
destroy:
取消商品收藏
"""
# queryset = UserFav.objects.all() # 只能看自己的收藏记录
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
serializer_class = UserFavSerializer
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
lookup_field = "goods_id" # 分流处理 序列化组件
def get_serializer_class(self):
if self.action == "list":
return UserFavDetailSerializer
elif self.action == "create":
return UserFavSerializer
return UserFavSerializer def get_queryset(self):
return UserFav.objects.filter(user=self.request.user)

用户留言

基本上所用的字段什么的在上面都有用过了

序列化组件

需要注意的是留言时间的格式, 以及只读属性

注意 user 字段的传入应该是默认的当前用户, 且此字段可以设置成隐藏

# 用户留言
class LeavingMessageSerializer(serializers.ModelSerializer):
# 设置隐藏字段
user = serializers.HiddenField(
# 默认值为当前用户
default=serializers.CurrentUserDefault()
)
# 留言的时间不能自己指定, 应该是系统自动根据当前的时间, 因此设置为只读
add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta:
model = UserLeavingMessage
fields = ("user", "message_type", "subject", "message", "file", "id", "add_time")

视图

# 用户留言
class LeavingMessageViewset(mixins.ListModelMixin, mixins.DestroyModelMixin, mixins.CreateModelMixin,
viewsets.GenericViewSet):
"""
list:
获取用户留言
create:
添加留言
delete:
删除留言功能
""" permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
serializer_class = LeavingMessageSerializer def get_queryset(self):
return UserLeavingMessage.objects.filter(user=self.request.user)

用户收货地址

基本上和留言一样了.

序列化组件

# 收货地址
class AddressSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta:
model = UserAddress
fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")

视图

# 收货地址
class AddressViewset(viewsets.ModelViewSet):
"""
收货地址管理
list:
获取收货地址
create:
添加收货地址
update:
更新收货地址
delete:
删除收货地址
""" permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
serializer_class = AddressSerializer def get_queryset(self):
return UserAddress.objects.filter(user=self.request.user)

全部代码

替换视图序列化

# _*_ coding:utf-8 _*_
from rest_framework.validators import UniqueTogetherValidator from goods.serializers import GoodsSerializer __author__ = "yangtuo"
__date__ = "2019/4/18 20:31" from rest_framework import serializers from .models import UserFav, UserLeavingMessage, UserAddress # 收藏详情
class UserFavDetailSerializer(serializers.ModelSerializer):
goods = GoodsSerializer() class Meta:
model = UserFav
fields = ("goods", "id") # 用户收藏
class UserFavSerializer(serializers.ModelSerializer):
# 用户就使用当前的默认用户, 并且设置为隐藏
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
) class Meta:
model = UserFav
# 联合唯一可以在 model 中创建的时候进行操作, 通过 ModelSerializer 自然会帮你完成验证
# 也可以在这里完成, 注意是在 Meta 中进行设置, 因为这是多字段的处理
validators = [
UniqueTogetherValidator(
queryset=UserFav.objects.all(),
fields=('user', 'goods'),
message="已经收藏过了"
)
]
fields = ("user", "goods", "id") # 删除的需要因此加上 id, 这样方便删除操作 # 用户留言
class LeavingMessageSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
# 留言的时间不能自己指定, 应该是系统自动根据当前的时间, 因此设置为只读
add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta:
model = UserLeavingMessage
fields = ("user", "message_type", "subject", "message", "file", "id", "add_time") # 收货地址
class AddressSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta:
model = UserAddress
fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")

用户操作视图

# _*_ coding:utf-8 _*_
from rest_framework.validators import UniqueTogetherValidator from goods.serializers import GoodsSerializer __author__ = "yangtuo"
__date__ = "2019/4/18 20:31" from rest_framework import serializers from .models import UserFav, UserLeavingMessage, UserAddress # 收藏详情
class UserFavDetailSerializer(serializers.ModelSerializer):
goods = GoodsSerializer() class Meta:
model = UserFav
fields = ("goods", "id") # 用户收藏
class UserFavSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
) class Meta:
model = UserFav
# 联合唯一可以在 model 中创建的时候进行操作, 通过 ModelSerializer 自然会帮你完成验证
# 也可以在这里完成, 注意是在 Meta 中进行设置, 因为这是多字段的处理
validators = [
UniqueTogetherValidator(
queryset=UserFav.objects.all(),
fields=('user', 'goods'),
message="已经收藏过了"
)
]
fields = ("user", "goods", "id") # 删除的需要因此加上 id, 这样方便删除操作 # 用户留言
class LeavingMessageSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
# 留言的时间不能自己指定, 应该是系统自动根据当前的时间, 因此设置为只读
add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta:
model = UserLeavingMessage
fields = ("user", "message_type", "subject", "message", "file", "id", "add_time") # 收货地址
class AddressSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M') class Meta:
model = UserAddress
fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")

DRF 商城项目 - 用户操作(收藏, 留言, 收货地址)的更多相关文章

  1. Django电商项目---完成用户中心(订单中心+收货地址)day7

    完成用户中心(收货地址) df_user/views.py df_user/urls.py templates/df_user/user_center_site.html 界面显示 完成用户中心(全部 ...

  2. DRF 商城项目 - 用户( 登录, 注册,登出,个人中心 ) 逻辑梳理

    用户登录 自定义用户登录字段处理 用户的登录时通过 手机号也可以进行登录 需要重写登录验证逻辑 from django.contrib.auth.backends import ModelBacken ...

  3. Django商城项目笔记No.16用户部分-用户中心收货地址

    首先完成省市区三级联动 新建areas应用 python ../../manage.py startapp areas 模型类代码 class Area(models.Model): "&q ...

  4. DRF 商城项目 - 购物( 购物车, 订单, 支付 )逻辑梳理

    购物车 购物车模型 购物车中的数据不应该重复. 即对相同商品的增加应该是对购买数量的处理而不是增加一条记录 因此对此进行联合唯一索引, 但是也因此存在一些问题 class ShoppingCart(m ...

  5. 42 Flutter仿京东商城项目 修改默认收货地址 显示默认收货地址

    CheckOut.dart import 'package:flutter/material.dart'; import '../services/ScreenAdapter.dart'; impor ...

  6. 41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播

    加群452892873 下载对应41课文件,运行方法,建好项目,直接替换lib目录 AddressAdd.dart import 'package:dio/dio.dart'; import 'pac ...

  7. 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器

    加群452892873 下载对应39课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml city_pickers: ^ AddressAdd.dart import 'packa ...

  8. HMS Core定位服务在生活服务类App中可以自动填写收货地址啦

    在涉及团购.外卖.快递.家政.物流.搬家等生活服务类的App.小程序中,填写收货地址是用户高频使用的功能.这一功能通常采取让用户手动填写的解决方案,例如上下拉动选择浙江省-->杭州市--> ...

  9. 微信小程序-收货地址左滑删除

    我参照了其中的部分代码,如:bindtouchstart,bindtouchmove,bindtouchend事件多数组中偏移值的更改, 在结合微信 movable-area 和 movable-vi ...

随机推荐

  1. 查询拼接SQL语句,多条件模糊查询

    多条件查询,使用StringBuilder拼接SQL语句,效果如下: 当点击按钮时代码如下: private void button1_Click(object sender, EventArgs e ...

  2. 简简单单的Vue1(MVVM与Vue的双向绑定原理)

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 Vue 在此之前的文章我们讲述了前端开发的工具,语言的知识,接下来我们从头开始学习一个 ...

  3. SpringCloud-sleuth-zipkin链路追踪

    什么是Zipkin? 它是一个分布式链路跟踪系统它可以帮助收集时间数据,每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序:如果想解决延迟 ...

  4. AJAX的创建

    20:29:50 创建的步骤: 1.创建异步请求的核心对象 2.设置请求方式和地址 3.设置结果产生的回调函数 4.进行结果的逻辑处理 5.获取结果并处理 6.发送请求 <!DOCTYPE ht ...

  5. Servlet--创建和配置Servlet

    在web开发中,一般由Servlet进行数据流的控制,并通过HttpServletResponse对象对请求做出响应.创建的Servlet必须继承HttpServlet类,并实现doGet()和doP ...

  6. wordpress常用函数及使用位置

    single 页面: 摘要内容:the_excerpt():如果摘要空,摘取正文内容:需要在循环中使用 获取当下页面的分类:wp_get_post_terms( int $post_id, strin ...

  7. C# 利用键值对取代Switch...Case语句

    swich....case 条件分支多了之后,会严重的破坏程序的美观性. 比如这个 上述代码是用于两个进程之间通信的代码,由于通信的枚举特别的多,所以case的分支特别的多.导致了代码的可读性,可维护 ...

  8. postman的简单使用

    Postman简单的使用  什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求.可以对网页进行简单的基本信息调试.Postman最早是作用chrome浏览器插件存在的,但是2018年初 ...

  9. 解决ajax跨域访问sessionid不一致问题

    根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务器就会以为 ...

  10. JQuery 图片轮播,详细注释说明,让你一看就会!

    准备工作: 1.准备几张大小相同的图片 完成功能: 1.自动轮播 2.手动轮播 3.点击二侧按钮前后切换图片 JQuery插件地址: 链接:https://pan.baidu.com/s/1zNl2- ...