美多(web)开发第六天

这篇博客主要介绍了美多Web应用的订单管理功能,包括查询多条和单条订单,以及如何修改订单状态。同时,详细阐述了系统的权限管理系统,涉及到权限管理方式、用户、组以及权限之间的多对多关系。还提到了如何实现管理员的增删改查以及权限查询操作。
摘要由CSDN通过智能技术生成
订单管理
  • 功能
    • 查询多条: 分页过滤 ----->ListModelmixin
    • 查询一条----->reterievemodelmixin
    • 修改订单状态---->无,自定义实现
  • 视图类 : readonlymodelviewset
  • 序列化器类:modelserializer
在views中新建orders
	from rest_framework.viewsets import ReadOnlyModelViewSet
 	from apps.orders.models import OrderInfo
 	from apps.meiduo_admin.serializers.orders import OrderSerializer
 	from apps.meiduo_admin.utils.meiduo_pagination import MeiduoPagination
 	
 	class OrderViewSet(ReadOnlyModelViewSet):
 	    def get_queryset(self):
 	        queryset = OrderInfo.objects
 	        keyword = self.request.query_params.get('keyword')
 	        if keyword:
 	            queryset = queryset.filter(order_id__contains=keyword)
 	        queryset = queryset.order_by('-create_time')
 	        return queryset
 	
 	    serializer_class = OrderSerializer
 	    pagination_class = MeiduoPagination
serializer中新建orders

 	from rest_framework import serializers
 	from apps.orders.models import OrderInfo, OrderGoods
 		
 	class OrderSerializer(serializers.ModelSerializer):
 	    class Meta:
 	        model = OrderInfo
 	        fields = ['order_id', 'create_time']
在urls新建视图
#订单
from .views import orders
router.register('orders', orders.OrderViewSet, base_name='orders')
查询一条
  • 定义序列化器
  • 定义视图类
  • 配置路由规则
  • 不同请求使用不同的序列化器类型
    • 使用方法,而不使用属性,指定序列化器类型
    • serialzier_class
    • get_serializer_class()

修改状态

在views的orders中添加代码
    # serializer_class = OrderSerializer
 	    # 需要根据不同的请求,调用不同的序列化器,所以不用属性,改用方法
 	    def get_serializer_class(self):
 	        if 'pk' in self.kwargs:
 	            # 查询一条
 	            return OrderDetailSerializer
 	        else:
 	            # 查询多条
 	            return OrderSerializer
 	
 	 	    pagination_class = MeiduoPagination
在serializers的orders.py添加代码
	class SkuSerializer(serializers.Serializer):
 	    name = serializers.CharField()
 	    default_image = serializers.ImageField()
 	
 	
 	class OrderGoodsSerializer(serializers.Serializer):
 	    count = serializers.IntegerField()
 	    price = serializers.DecimalField(max_digits=10, decimal_places=2)
 	    sku = SkuSerializer(read_only=True)
 	
 	
 	class OrderDetailSerializer(serializers.ModelSerializer):
 	    # 输出用户名
 	    user = serializers.StringRelatedField(read_only=True)
 	    # 输出订单的商品
 	    skus = OrderGoodsSerializer(many=True, read_only=True)
 	
 	    class Meta:
 	        model = OrderInfo
 	        fields = '__all__'
修改状态
  • 自定义方法
  • 装饰器action,为自定义方法生成路由规则
views的orders中添加代码
    	@action(methods=['PUT'], detail=True)
 	    def status(self, request, pk):
 	        # 修改订单状态
 	        # 接收
 	        order_status = request.data.get('status')
 	
 	        # 验证
 	        if not all([order_status]):
 	            return Response({'errors': '参数不完整'}, status=400)
 	
 	        # 处理
 	        # 查询订单对象
 	        # order=OrderInfo.objects.get(pk=pk)
 	        instance = self.get_object()
 	
 	        # 修改订单状态
 	        instance.status = order_status
 	        instance.save()
 	
 	        # 响应
 	        return Response({
 	            'order_id': instance.order_id,
 	            'status': order_status
 	        })

系统管理

权限管理方式
  • 用户
  • 权限
  • 关系:多对多
    • 一对一:models.OneToOneField()
    • 一对多:models.ForeignKey()
    • 多对多:models.ManyToManyField()
在serializers新建permission.py文件
	from rest_framework import serializers
 	from django.contrib.auth.models import Permission
 	
 	class PermissionSerializer(serializers.ModelSerializer):
 	    class Meta:
 	        model = Permission
 	        fields = '__all__'
views新建permission.py 
	from rest_framework.generics import ListAPIView
 	from apps.meiduo_admin.serializers.permission import PermissionSerializer
 	from django.contrib.auth.models import Permission
 	from apps.meiduo_admin.utils.meiduo_pagination import MeiduoPagination
 		
 	class PermissionView(ListAPIView):
 	    queryset = Permission.objects.all()
 	    serializer_class = PermissionSerializer
 	    pagination_class = MeiduoPagination
路由规则
  		 # 权限
 	    url('^permission/perms/$', permission.PermissionView.as_view()),
权限
  • ListAPIView
  • ModelSerializer
serializers新建group.py
	from rest_framework import serializers
 	from django.contrib.auth.models import Group
 	
 	class GroupSerializer(serializers.ModelSerializer):
 	    class Meta:
 	        model = Group
 	        fields = '__all__'
views新建group.py
	from rest_framework.viewsets import ModelViewSet
 	from django.contrib.auth.models import Group
 	from apps.meiduo_admin.serializers.group import GroupSerializer
 	from apps.meiduo_admin.utils.meiduo_pagination import MeiduoPagination
 	
 	
 	class GroupViewSet(ModelViewSet):
 	    queryset = Group.objects.all()
 	    serializer_class = GroupSerializer
 	    pagination_class = MeiduoPagination
添加路由规范
# 权限-组
 	router.register('permission/groups', group.GroupViewSet, base_name='groups')
权限查询
  • ListAPIView
  • ModelSerializer

  • ModelViewSet
  • ModelSerializer
  • 说明:在模型类序列化器中,默认封装了多对多关系的代码
serializers中permission.py添加代码
	class PermissionSimpleSerializer(serializers.Serializer):
 	    id = serializers.IntegerField()
 	    name = serializers.CharField()
views/permission.py添加代码
	class PermissionSimpleView(ListAPIView):
 	    queryset = Permission.objects.all()
 	    serializer_class = PermissionSimpleSerializer
路由规范
    # 权限选择数据
	url('^permission/simple/$', permission.PermissionSimpleView.as_view()),
管理员
  • 功能:管理员,完整
  • 视图类:ModelViewSet
  • 序列化器类:ModelSerializer
  • 查询组,不带分页,用于选择
    • 在组的视图集中,新定义方法simple,添加装饰器action
  • 添加时修改序列化器
    • 增加属性:‘password’, ‘groups’, ‘user_permissions’
    • 重写create()方法:密码加密,设置管理员
获取管理员
serializers新建admin.py
	from rest_framework import serializers
 	from apps.users.models import User
 	
 	
 	class AdminSerializer(serializers.ModelSerializer):
 	    class Meta:
 	        model = User
 	        fields = ['id', 'username', 'email', 'mobile']
views中admin.py添加代码
	class AdminViewSet(ModelViewSet):
 	    queryset = User.objects.filter(is_staff=True).order_by('-id')
 	    serializer_class = AdminSerializer
 	    pagination_class = MeiduoPagination
# 权限-管理员
 	router.register('permission/admins', admin.AdminViewSet, base_name='admins')
保存管理员权限
views/group.py中添加查询权限添加功能
    	@action(methods=['GET'], detail=False)
 	    def simple(self, request):
 	        # 查询所有组,返回后供添加管理员时选择
 	        queryset = self.get_queryset()
 	        serializer = self.get_serializer(queryset, many=True)
 	        return Response(serializer.data)
管理员的增加创建权限
/serializers中admin.py添加代码
		class AdminSerializer(serializers.ModelSerializer):
 	    password = serializers.CharField(write_only=True)
 	
 	 	    class Meta:
 	 	        model = User
 		        fields = ['id', 'username', 'email', 'mobile']
 	        fields = ['id', 'username', 'email', 'mobile', 'password', 'groups', 'user_permissions']
 	        read_only_fields = ['id']
 	
 	    def create(self, validated_data):
 	        instance = super().create(validated_data)
 	
 	        # 密码加密
 	        instance.set_password(validated_data.get('password'))
 	        # 设置管理员
 	        instance.is_staff = True
 	        instance.save()
 	
 	        return instance
管理员信息修改
    	def update(self, instance, validated_data):
 	        instance = super().update(instance, validated_data)
 	
 	        # 密码加密
 	        instance.set_password(validated_data.get('password'))
 	        instance.save()
 	
 	        return instance
增加权限验证
views/group.py添加
views/orders.py添加
from rest_framework.permissions import IsAdminUser, DjangoObjectPermissions

permission_classes = [IsAdminUser, DjangoObjectPermissions]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值