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