DRF 商城项目

个人收藏 

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

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

查看收藏  ( 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")
原文地址:https://www.cnblogs.com/shijieli/p/10744910.html