DRF学习之用户收藏功能的实现(十四)

1.配置serializer

from rest_framework import serializers
from .models import UserFav


class UserFavSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserFav
        fields = ['user', 'goods']

2.配置用户收藏商品ViewSet

# apps/user_operation/views.py

from rest_framework import viewsets, mixins
from .serializers import UserFavSerializer
from .models import UserFav


class UserFavViewSet(mixins.CreateModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
    """
    用户收藏商品
    取消收藏商品
    """
    queryset = UserFav.objects.all()
    serializer_class = UserFavSerializer

3.配置url路由

#收藏
router.register(r'userfavs', UserFavViewset, basename="userfavs")

4.加上自动获取用户信息功能


class UserFavSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()  #作用:自动获取当前用户
    )

    class Meta:
        model = UserFav
        fields = ['user', 'goods']

5.根据前后端分离的url默认规则,取消收藏需要加入id,在fileds中加入id。

fields = ("user", "goods", "id")

6.设置用户和商品对应联合唯一,当数据已存在时,数据库就会抛出异常

class UserFav(models.Model):
    """
    用户收藏
    """
    user = models.ForeignKey(User, verbose_name="用户",on_delete=models.CASCADE)
    goods = models.ForeignKey(Goods, verbose_name="商品", help_text="商品id",on_delete=models.CASCADE)
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")

    class Meta:
        verbose_name = '用户收藏'
        verbose_name_plural = verbose_name
        unique_together = ("user", "goods")

    def __str__(self):
        return self.user.username

7.防止被反复收藏,设置UniqueTogetherValidator使收藏商品数据联合具有唯一性。

class UserFavSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = UserFav
        validators = [
            #做一个联合唯一索引
            UniqueTogetherValidator(
                queryset=UserFav.objects.all(),
                fields=('user', 'goods'),
                message="已经收藏"
            )
        ]

        fields = ("user", "goods", "id")

注:数据库中唯一约束的添加实际上就是增加了一个索引
一、单列唯一约束
在一列上添加唯一约束,主要是让该列在表中只能有唯一的一行,例如注册邮箱时的邮箱名、手机号等信息
二、多列联合唯一约束
如果业务中要求两个字符联合起了是唯一的,比如“地址”+“名称”是唯一的,这就需要对两列,甚至多列添加联合唯一约束

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值