第六天

viewsets实现商品详情页

viewset中加入mixins-> retrievemodelmixin
serializer中增加一个serializer指向商品详情页
adminx文件中之前注释掉的文件取出

# 在Goods中显示Image
    class GoodsImagesInline(object):
        model = GoodsImage
        exclude = ["add_time"]
        extra = 1
        style = 'tab'
    inlines = [GoodsImagesInline]  # 此处用于显示外键的相关信息

热卖商品

filter中添加is_hot字段过滤

用户收藏

serializer绑定当前用户

  user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

构建联合唯一索引防止重复收藏

# 构建联合唯一索引防止重复收藏
    class Meta:
        verbose_name = '用户收藏'
        verbose_name_plural = verbose_name
        unique_together = ("user", "goods")
此时重复收藏就会报错 (browser  api_root)
{
    "non_field_errors": [
        "字段 user, goods 必须能构成唯一集合。"
    ]
}

另一种方法写入serializer中的meta =>作用于所有字段
自定义了收藏

        validators = [
            UniqueTogetherValidator(
                queryset=UserFav.objects.all(),
                fields=('user', 'goods'),
                message="已经收藏"
            )]

permission

用户认证和权限
配置认证和权限是两回事,不可混为一谈。auth和permission。
配置对象即验证,最好不要全局setting认证,防止token过期导致公共页面无法访问

drf权限认证,自定义对象级权限。配置认证方式,根据代码判断=>如果配置了对象级认证,那么访问该对象时将可能有双重认证。

个人中心

drf文档功能

1.read: 和retrieve: 都可以对单个get进行文档注释
2.help_text加在serializer上和model上和filter上都可以

动态设置serializer和permission

在userviewset当中重载函数,该函数需要查看源码了解功能

    def get_permissions(self):
        if self.action == "retrieve":
            return [permissions.IsAuthenticated()]
        elif self.action == "create":
            return []

        return []

    def get_serializer_class(self):
        if self.action == "retrieve":
            return UserDetailSerializer
        elif self.action == "create":
            return UserRegisterSerializer

        return UserDetailSerializer

还有一个问题,本用户只能获取自身的信息

    # 重写该方法,不管传什么id,都只返回当前用户
    def get_object(self):
        return self.request.user

前端修改生日弹出提示框,其他没有。可以再看下。

** 此字段非常重要=>lookup_field = "goods_id" **
单项查找时的搜索字段,默认为pk,可能表示model_id。查询是在query_set之后,已经经过了过滤。

你可能感兴趣的:(第六天)