美多(web)后台第五天

复习第三天代码
  • 1 拆解实现步骤:

    • 视图类
    • 序列化器类
  • 2 分段写代码,分段测试

    • 调整思路
    • 实现方法
    • 从模型类查找属性id,查询集
  • 3 celery的异步任务

    • 1.新建文件包,detail
    • 2.新建文件夹 tasks.py
    • 3 定义方法 +装饰器
    • 4 注册
    • 5 启动工人

sku管理

查询一个
  • retrieceModelmixin,queryset,serializer
  • ModelSerializer
修改
  • 逻辑
    • 1 修改sku
    • 2修改sku规格
    • 3 操作多张表,引入事务
    • 4 生成静态文件
  • 实现 重写update()方法
    def update(self, instance, validated_data):
        with transaction.atomic():
            sid = transaction.savepoint()
            try:
                specs = validated_data.pop('specs')
                # 修改sku
                instance=super().update(instance,validated_data)
                # 修改sku规格
                # 删除旧规格
                SKUSpecification.objects.filter(sku_id=instance.id).delete()
                # 添加新规格
                for item in specs:
                    item['sku_id']= instance.id
                    SKUSpecification.objects.create(**item)
            except:
                transaction.savepoint_rollback(sid)
                raise serializers.ValidationError('sku修改失败') 
            else:
                transaction.savepoint_commit(sid)
                task_generate.delay(instance.id)
        return instance
删除
  • 视图类: DestroyModelMixin
  • 模型类:无
  • 指定查询集
    • 说明1 默认物理删除,想要删除,在视图类重写destroy方法
    • 说明2 删除sku时,sku表一起被删除,因为外键删除方式为级联
新知识点:FDSF
  • 运行一下进程(前提有包在桌面)

    • $ pip install fdfs_client-py-master.zip
    • $ pip install mutagen
    • $ pip install requests
  • 开发

    • 上传
    • 修改
    • 删除
  • 访问:在storage中安装了nginx 监听8888端口,完成图片访问

  • 配置

    • 将client.conf拷贝到utils中
    • 修改本机ip
  • 上传

    • 方法upload_by_filename():指定文件图片位置
    • 方法uplo_by-buffer():获取指定的二进制数据,如在客户端上传的图片
  • 修改:modify_…此方法抛异常

  • 删除:delete_file(fastdfs中文件的名称)

  • 错误1:报磁盘空间不足,No space on device left.

    • 解决:扩空间,或删除旧内容
  • 错误2:No such file or directory

    • 解决:启动tracker、storage
  • 错误3:启动storage失败

    • 解决:sudo rm /var/fdfs/storage/data/fdfs_storaged.pid
  • 错误4:容器storage、tracker都已经启动,但是仍然报文件不存在的错误

    • 解决:停止两个容器,删除两个容器,run两个容器
    • 注意:启动storage时查看当前机器的ip并设置
图片管理
  • 文件的存储方案
    • 将文件上传到一个分布式分服务器中
    • 将文件名保存在表中
  • 实现
    • 视图类: ModelViewSet
    • 序列化类: ModelSerializer
修改模板django
在views中创建images.py文件
from rest_framework.viewsets import ModelViewSet
from apps.goods.models import SKUImage
from apps.meiduo_admin.serializers.images import ImageSerializer
from apps.meiduo_admin.utils.meiduo_pagination import MeiduoPagination

class ImageViewSet(ModelViewSet):
    queryset = SKUImage.objects.order_by('-id')
    serializer_class = ImageSerializer
    pagination_class = MeiduoPagination
在serializer中创建images.py
from rest_framework import serializers
from apps.goods.models import SKUImage

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = SKUImage
        fields = ['id','sku','image']
路由规范(重点   放在skus的上边  以免出现不匹配)
router.register('skus/images',images.ImageViewSet,base_name='images')
sku商品id的实现
在serializer的sku中增加
class SkuSimpleSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
views的sku中增加
class SkuSimpleView(ListAPIView):
    queryset = SKU.objects.all()
    serializer_class = SkuSimpleSerializer
路由规范
# 查询所有的sku,返回简单数据,用于添加商品图片时的选择
url('^skus/simple/$', sku.SkuSimpleView.as_view()),
增加
  • 准备:查询sku的简单数据
  • 实现的功能:
    • 创建模型类对象
    • 将图片保存到fastdfs
需要在dev.py中配置  用来保存图片
 FDFS_CLIENT_CONF = os.path.join(BASE_DIR,'utils/fastdfs/client.conf')
    # 重写创建方法,原因:默认代码只有创建对象的功能,不包含上传图片的功能
    def create(self, request, *args, **kwargs):
        # 1.接收
        sku_id = request.data.get('sku')  # sku编号
        image_file = request.data.get('image')  # 图片文件对象

        # 2.验证
        if not all([sku_id, image_file]):
            raise serializers.ValidationError('数据不完成')

        # 3.处理
        # 3.1上传图片到fastdfs
        client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        result = client.upload_by_buffer(image_file.read())
        image_name = result.get('Remote file_id')

        # 3.2创建模型类对象
        instance = SKUImage.objects.create(sku_id=sku_id, image=image_name)

        # 4.响应
        return Response({
            'id': instance.id,
            'sku': instance.sku_id,
            'image': instance.image.url
        })

修改
  • 功能
    • 修改图片
    • 修改模型类对象
  • 注意:对于ImageField类型的属性操作方式
    • 赋值:属性名=字符串
    • 读取:是对象,通过url属性访问路径,通过name属性访问文件名
 # 重写修改方法,原因:默认代码中只侯对象,不包含图片修改
    def update(self, request, pk, *args, **kwargs):
        instance = SKUImage.objects.get(pk=pk)
        # 1.接收
        sku_id = request.data.get('sku')
        image_file = request.data.get('image')

        # 2.验证
        if not all([sku_id, image_file]):
            raise serializers.ValidationError('数据不完整')

        # 3.处理
        # 3.1修改图片
        client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        # 3.1.1删除
        client.delete_file(instance.image.name)
        # 3.1.2上传
        result = client.upload_by_buffer(image_file.read())
        image_name = result.get('Remote file_id')

        # 3.2修改模型类对象
        instance.sku_id = sku_id
        instance.image = image_name
        instance.save()

        # 4.响应
        return Response({
            'id': instance.id,
            'sku': instance.sku_id,
            'image': instance.image.url
        })
删除
  • 默认实现逻辑:删除模型类对象
  • 当前功能:
    • 删除图片
    • 删除模型类对象
    def destroy(self, request, pk, *args, **kwargs):
        instance = SKUImage.objects.get(pk=pk)

        # 删除fastdfs中的图片
        client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client.delete_file(instance.image.name)

        instance.delete()

        return Response(status=204)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值