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格式上傳不成功

    • 來一個格式允許的吧

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM