私は現在、モバイルアプリのユーザが画像をDjango Serverにアップロードするプロジェクトを進めています。media_rootからDjango Restシリアライザへ画像を保存
クラスImageDetailsViewSet(APIView):
def post(self,request, *args, **kwargs):
try:
######### Accept string from the user
imgStr = request.data['image']
media_filename = os.path.join(settings.MEDIA_ROOT, 'img.jpg')
######## Create decoded string to a JPEG file and save it to media_root
img = Image.open(StringIO(imgStr.decode('base64')))
img.save(media_filename, 'JPEG')
###### Update request data to include the newly created image to the request
user = request.user.get_username()
data1 = {'image': media_filename, 'category': 1, 'status': 'Y', 'user': user}
serializer = ImageDetailsSerializer(data=data1)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
except:
raise
return Response(serializer.errors, status=status.HTTP_415_BAD_REQUEST)
マイImageDetailsSerializer:
class ImageDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = ImageDetails
fields= ('image','status','category', 'user')
コードここ
は、ユーザからのPOSTリクエストを提供しています私の見解でありますシリアライザがvaではないことを意味するHTTP 400エラーを常に返します蓋。
は、ここで私は適用しようとしたが、この場合には動作しませんソリューションです:
変更IMGへ
data1 = {'image': media_filename, 'category': 1, 'status': 'Y', 'user': user}
からmedia_filenameそれはTypeError: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2976x3968 at 0x841D2F0> is not JSON serializable
エラーが
media_url/img.jpg
にmedia_filenameを交換して返し、同じエラーを返します。シリアライザで更新画像フィールドは、(下記のコードを参照)を追加することによって、それがすべてで任意の改善を行う行います
class ImageDetailsSerializer(serializers.ModelSerializer): image = serializers.ImageField(use_url=True) class Meta: model = ImageDetails fields= ('image','status','category', 'user')
私の質問は以下のとおりです。
どうすべきシリアライザのImageFieldに格納されますか?イメージ、イメージURL、またはイメージのディレクトリが格納されていますか?
これはリモートユーザーからのデータを保存する正しい方法ですか、テクニックですか?あるいはこれを実装する他の効果的な方法がありますか?
私は 'request.data ['image'] = media_filename'を追加することで、request.data自体を編集しようとしました。 ' request.data ['category'] = 1' 'request.data ['status'] = 'Y'' '私は' serializer = ImageDetailsSerializer(data = request.data) 'へのリクエストを更新しましたが、私はまだ400エラーがあります(シリアライザは有効ではありません)。 – jonilyn2730
私はあなたがリクエストからポストパラメータに 'イメージ'ステータス 'カテゴリ' 'ユーザー'を追加できると思います。動作しない場合は、検証エラーの詳細を出力できます。 – Guinner