django drf 反序列化上传图片

Posted u-damowang1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django drf 反序列化上传图片相关的知识,希望对你有一定的参考价值。

  • settings.py
#上传图片的类型
ALLOWED_IMG_TYPE = [jpg,png,PNG]

#上传图片的地址
UPLOAD_ADDRESS = static/upload/

STATIC_URL = /static/
#配置静态文件夹


STATICFILES_DIRS = [
    os.path.join(BASE_DIR,static),
]
  • urls.py    (二级路由)  
from django.urls import path
from . import views
#二级路由
urlpatterns = [
  path(goods/, views.GoodsView.as_view()),
]
  • serializers.py
#商品的反序列化
class GoodUnSerializer(serializers.Serializer):
    #商品名称约束
    name = serializers.CharField(max_length=32)
    #商品价格约束
    price = serializers.DecimalField(max_digits=9,decimal_places=2)
    #商品分类约束
    cate_id = serializers.IntegerField()
    #商品图片约束
    img = serializers.CharField(max_length=255)
    def create(self, validated_data):
        #将获取的字典类型打散
        return models.Goods.objects.create(**validated_data)
  • views.py  (字段name,price等可以写约束条件,这里就简单的给图片做一个约束)
#商品
class GoodsView(APIView):
   
    def post(self, request):
        name = request.POST.get(name, ‘‘).strip()
        price = request.POST.get(price, 0)
        cate_id = request.POST.get(cate_id)
        data = {
            name:name,
            price:price,
            cate_id:cate_id
        }
        img = request.FILES.get(img)
        if img:
            #获取后缀名
            ext = img.name.split(.)[-1]
            #如果上传图片的后缀名不在配置的后缀名里返回格式不允许
            if ext not in settings.ALLOWED_IMG_TYPE:
                return Response({
                    "status":205,
                    "msg":"格式不允许",
                    "data":‘‘
                })
            # path = ‘‘
            #新的文件名
            newfielname = datetime.now().strftime(%Y%m%d%H%M%S) + str(random.randint(10000,99999)) + . + ext  #采用时间和随机数
            path = settings.UPLOAD_ADDRESS + newfielname
            with open(path,wb) as f:  #二进制写入
                for i in img.chunks():
                    f.write(i)
            data[img] = newfielname
            #入库反序列化添加
            obj = GoodUnSerializer(data=data)
            if obj.is_valid():
                obj.save()
                print(obj.errors)
                return Response({
                    status:200,
                    msg:添加成功,
                    data:‘‘

                })

            return Response({
                status:201,
                msg:添加失败,
                data:‘‘
            })
  • 测试
    •   不成功的技术图片
    技术图片

  由于之前限制图片的后缀名,所以jfif格式上传不成功

    • 来一个格式允许的吧

技术图片

技术图片

 

以上是关于django drf 反序列化上传图片的主要内容,如果未能解决你的问题,请参考以下文章

django DRF 图片路径问题

drf --- 序列化实操

django 学习之DRF

drf 序列化 反序列化

Django REST framework编写图片上传接口并测试

DRF入门规范