/ / Enregistrer l'image de media_root dans Django Rest Serializer - django, image, sérialisation, django-rest-framework, httprequest

Enregistrer l'image de media_root dans Django Rest Serializer - django, image, sérialisation, django-rest-framework, httprequest

Je travaille actuellement sur un projet qui permet à l'utilisateur d'une application mobile de télécharger des images sur un serveur Django.

Voici ma vue qui sert la demande POST de l'utilisateur:

classe 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)

My ImageDetailsSerializer:

class ImageDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = ImageDetails
fields= ("image","status","category", "user")

Le code renvoie toujours une erreur HTTP 400, ce qui signifie que le sérialiseur n'est pas valide.

Voici les solutions que j'ai essayé d'appliquer mais qui ne fonctionnent pas dans ce cas:

  1. Modifiez le nom du fichier média data1 = {"image": media_filename, "category": 1, "status": "Y", "user": user} img mais il revient TypeError: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2976x3968 at 0x841D2F0> is not JSON serializable Erreur

  2. Remplacez nom_fichier_média par media_url/img.jpg, il renvoie la même erreur.

  3. Mettez à jour le champ d'image dans le sérialiseur en l'ajoutant (voir le code ci-dessous) mais cela apporte des améliorations:

       class ImageDetailsSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(use_url=True)
    class Meta:
    model = ImageDetails
    fields= ("image","status","category", "user")
    

Mes questions sont:

  1. Que doit-on stocker dans un ImageField d'un sérialiseur? une image, une URL d'image ou le répertoire dans lequel l'image est stockée?

  2. Est-ce la bonne manière / technique pour enregistrer les données d'un utilisateur distant? Ou existe-t-il un autre moyen efficace de mettre en œuvre cela?

Réponses:

0 pour la réponse № 1
  1. C’est le chemin par rapport à media_root
  2. Vous pouvez changer data1 à une copie de request.data et fusionner "l'utilisateur" clé dans le nouveau dict

0 pour la réponse № 2

La réponse à ce problème est d'utiliser le plugin Django-extra-fields. :RÉ Lis https://github.com/Hipo/drf-extra-fields pour plus de détails.