更新SKU表数据
1、 获取修改图片的详情信息
点就修改按钮时,我们需要先获取要修改的图片详情信息
接口分析
请求方式: GET /meiduo_admin/skus/images/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在头部中携带要获取的图片商品ID
返回数据: JSON
{
"id": "图片id",
"sku": "SKU商品id",
"image": "图片地址"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | "图片id" |
sku | int | 是 | SKU商品id |
iamge | str | 是 | 图片地址 |
后端实现
# ImageView继承的是ModelViewSet 所以还是使用同一个类视图
class ImageView(ModelViewSet):
serializer_class = ImageSeriazlier
queryset = SKUImage.objects.all()
pagination_class = PageNum
# 获取关联的sku表数据
def simple(self, request):
data = SKU.objects.all()
ser = SKUSeriazlier(data, many=True)
return Response(ser.data)
# 重写拓展类的保存业务逻辑
def create(self, request, *args, **kwargs):
# 创建FastDFS连接对象
client = Fdfs_client(settings.FASTDFS_PATH)
# 获取前端传递的image文件
data = request.FILES.get('image')
# 上传图片到fastDFS
res = client.upload_by_buffer(data.read())
# 判断是否上传成功
if res['Status'] != 'Upload successed.':
return Response(status=403)
# 获取上传后的路径
image_url = res['Remote file_id']
# 获取sku_id
sku_id = request.data.get('sku')[0]
# 保存图片
image = SKUImage.objects.create(sku_id=sku_id, image=image_url)
# 返回结果
return Response(
{
'id': image.id,
'sku': sku_id,
'image': image.image.url
},
status=201 # 前端需要接受201状态码
)
2、更新图片
接口分析
请求方式: PUT /meiduo_admin/skus/images/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
表单提交数据:
"sku": "SKU商品id",
"image": "SKU商品图片"
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku | str | 是 | SKU商品id |
image | Fiel | 是 | SKU商品图片 |
返回数据: JSON
{
"id": "图片id",
"sku": "SKU商品id",
"image": "图片地址"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 图片id |
sku | int | 是 | SKU商品id |
image | str | 是 | 图片地址 |
后端实现
from django.conf import settings
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from fdfs_client.client import Fdfs_client
from meiduo_admin.serializers.image import ImageSeriazlier, SKUSeriazlier
from meiduo_admin.utils.pagenum import PageNum
from goods.models import SKUImage, SKU
from celery_tasks.static_file.tasks import get_detail_html
class ImageView(ModelViewSet):
serializer_class = ImageSeriazlier
queryset = SKUImage.objects.all()
pagination_class = PageNum
def simple(self, request):
data = SKU.objects.all()
ser = SKUSeriazlier(data, many=True)
return Response(ser.data)
# 重写拓展类的保存业务逻辑
def create(self, request, *args, **kwargs):
client = Fdfs_client(settings.FASTDFS_PATH)
data = request.FILES.get('image')
res = client.upload_by_buffer(data.read())
if res['Status'] != 'Upload successed.':
return Response(status=403)
image_url = res['Remote file_id']
sku_id = request.data.get('sku')[0]
image = SKUImage.objects.create(sku_id=sku_id, image=image_url)
return Response(
{
'id': image.id,
'sku': sku_id,
'image': image.image.url
},
status=201
)
# 重写拓展类的更新业务逻辑
def update(self, request, *args, **kwargs):
# 创建FastDFS连接对象
client = Fdfs_client(settings.FASTDFS_PATH)
# 获取前端传递的image文件
data = request.FILES.get('image')
# 上传图片到fastDFS
res = client.upload_by_buffer(data.read())
# 判断是否上传成功
if res['Status'] != 'Upload successed.':
return Response(status=403)
# 获取上传后的路径
image_url = res['Remote file_id']
# 获取sku_id
sku_id = request.data.get('sku')[0]
# 查询图片对象
img=SKUImage.objects.get(id=kwargs['pk'])
# 更新图片
img.image=image_url
img.save()
# 生成新的详情页页面
get_detail_html.delay(img.sku.id)
# 返回结果
return Response(
{
'id': img.id,
'sku': sku_id,
'image': img.image.url
},
status=201 # 前端需要接受201状态码
)
注意事项:这儿更新操作必须重新修改父类代码,否则修改后的图片地址在数据库中是空的
【上面的create重写父类的方法都可以封装到序列化器中,视图方法中就可以不用写了,序列化器中封装好后,视图中的代码会继承父类的代码直接完成更新操作,方法和图片保存处的代码操作是一样的,这儿不在修改了】