复习第三天代码
-
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)