新人学习django 是按照这个大佬的教程学习的
链接: https://www.cnblogs.com/derek1184405959/p/8733194.html.
很多步骤都是按照上面的教程学习的,这里只是记录一下自己学习的过程和一些错误
如果有人想要系统的学习,建议去上面那位大佬处学习
九,个人中心功能的开发
1.drf的api文档自动生成,生成之后可交于前端进行查看
(1)
#drf文档,title自定义
path('docs',include_docs_urls(title='alotria')),
代码中注释的格式:
class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,viewsets.GenericViewSet):
'''
list:
商品列表,分页,搜索,过滤,排序
retrieve:
获取商品详情
'''
添加字段描述的三种方式
1.model的字段中加
2.serializer中字段加
3.filter字段加
2.在会员中心的页面,获取个人信息,只需要在UserViewset中多继承
mixins.RetrieveModelMixin
用户详情的序列化
user/serializers.py
class UserDetailSerializer(serializers.ModelSerializer):
"""
用户详情
"""
class Meta:
model=User
fields=("name","gender","birthday","email","mobile")
users/views.py
class UserViewset(CreateModelMixin,viewsets.GenericViewSet,mixins.RetrieveModelMixin,mixins.UpdateModelMixin):
"""
用户
"""
serializer_class=UserDetailSerializer
queryset = User.objects.all()
authentication_classes = (JSONWebTokenAuthentication,SessionAuthentication)
def create(self, request, *args, **kwargs):
serializer=self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user=self.perform_create(serializer)
re_dict=serializer.data
payload=jwt_payload_handler(user)
re_dict["token"]=jwt_encode_handler(payload)
re_dict["name"]=user.name if user.name else user.username
headers=self.get_success_headers(serializer.data)
return Response(re_dict,status=status.HTTP_201_CREATED,headers=headers)
#设置动态的权限配置
#当用户注册的时候不应该有权限限制
#当想要获取用户详情的时候,必须登录才行
def get_permissions(self):
if self.action=="retrieve":
return [IsAuthenticated()]
elif self.action=="create":
return []
return []
#动态配置序列化的方式
#注册的时候使用UserRegSerializer,只返回username和mobile
#会员中心要获取更多的用户信息,所以创建使用UserDetailSerializer
def get_serializer_class(self):
if self.action=="retrieve":
return UserDetailSerializer
elif self.action=="create":
return UserRegSerializers
return UserDetailSerializer
#继承了RetrieveModelMixin可以知道用户的详情,但是不知道用户的id,
#重写get_object方法获取用户id
def get_object(self):
return self.request.user
def perform_create(self, serializer):
return serializer.save()
添加获取用户信息继承的方法:mixins.RetrieveModelMixin
获取登录的用户,重写get_object
动态权限分配 get_permissions(self):
动态序列化 get_serializer_class(self):
用户个人信息的修改,多继承mixins.UpdateModelMixin就可以
需要修改的都是继承updata
3.用户收藏
(1)获取用户详情的,只需要获取商品,和用户id
先序列化
user_operation/serializers.py
class UserFavDetailSerializer(serializers.ModelSerializer):
"""
用户收藏详情
"""
#通过用户id获取收藏的商品,需要嵌套商品的序列化
goods=GoodsSerializer()
class Meta:
model=UserFav
fields=("goods","id")
(2)user_operation/views.py
动态设置序列化的方式
class UserFavViewSet(viewsets.GenericViewSet,mixins.ListModelMixin,mixins.CreateModelMixin,mixins.DestroyModelMixin):
"""
用户收藏
"""
serializer_class = UserFavSerializer
#permission是用来做权限判断的
## IsAuthenticated:必须登录用户;IsOwnerOrReadOnly:必须是当前登录的用户
permission_classes = (IsAuthenticated,IsOwnerOrReadOnly)
#auth做用户认证
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 UserFavDetailSerializer
def get_queryset(self):
#只能查看当前登录用户的收藏,不会获取所有用户的收藏
return UserFav.objects.filter(user=self.request.user)
修改vue端中的host和用户收藏中接收的json文件中的字段
4.用户留言的功能
(1)同样先序列化
user_operation/serializers.py
class LeavingMessageSerializer(serializers.ModelSerializer):
'''
用户留言
'''
# 获取当前登录的用户
user = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
#read_only:只返回,post时候可以不用提交,format:格式化输出
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")
(2)user_operation/views.py
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)
(3)配置url
# 配置用户留言的url
router.register(r'messages', LeavingMessageViewset, base_name="messages")
还是先查看messages 中数据的格式
修改vue中的host和vue中message组件中的字段
5.用户收获地址
(1)还是先序列化
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", "singer_name", "add_time", "signer_mobile")
这里的singer_name字段是在我创建model的时候手误写错了,于是就将错就错了
(2)user_operation/views.py
如果要实现增删改查功能,只要继承ModelViewSet就可以了
#如果要实现增删改查功能,只要继承ModelViewSet就可以了
class AddressViewset(viewsets.ModelViewSet):
"""
收获地址管理
list:获取收获地址
create:添加收获地址
updata:更新收获地址
delete:删除收获地址
"""
permission_classes = (IsAuthenticated,IsOwnerOrReadOnly)
authentication_classes = (JSONWebTokenAuthentication,SessionAuthentication)
serializer_class = AddressSerilaizer
def get_queryset(self):
return UserAddress.objects.filter(user=self.request.user)
(3)配置url
# 配置收货地址
router.register(r'address',AddressViewset , base_name="address")