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之后,已经经过了过滤。
网友评论