/ / Zapisz obraz z media_root do Django Rest Serializer - django, image, serialization, django-rest-framework, httprequest

Zapisz obraz z media_root do Django Rest Serializer - django, image, serializacja, django-rest-framework, httprequest

Obecnie pracuję nad projektem, który umożliwia użytkownikowi aplikacji mobilnej przesyłanie obrazów na serwer Django.

Oto mój widok, który obsługuje żądanie POST od użytkownika:

klasa 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")

Kod zawsze zwraca błąd HTTP 400, co oznacza, że ​​serializator jest nieprawidłowy.

Oto rozwiązania, które próbowałem zastosować, ale nie działają w tym przypadku:

  1. Zmień media_filename z data1 = {"image": media_filename, "category": 1, "status": "Y", "user": user} to img, ale wraca TypeError: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2976x3968 at 0x841D2F0> is not JSON serializable błąd

  2. Zastąp media_filename na media_url/img.jpg, zwraca ten sam błąd.

  3. Zaktualizuj pole obrazu w serializatorze, dodając (patrz kod poniżej), ale w ogóle wprowadza jakiekolwiek ulepszenia:

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

Moje pytania to:

  1. Co powinno być przechowywane w ImageField serializatora? obraz, adres URL obrazu lub katalog, w którym obraz jest przechowywany?

  2. Czy to jest właściwy sposób / technika zapisywania danych od zdalnego użytkownika? Czy jest jakiś inny skuteczny sposób na wdrożenie tego?

Odpowiedzi:

0 dla odpowiedzi № 1
  1. Jest to ścieżka względna do katalogu_główny_mediów
  2. Możesz się zmienić data1 do kopii request.data i połącz klucz „user” z nowym dyktando

0 dla odpowiedzi nr 2

Odpowiedzią na ten problem jest użycie wtyczki Django-extra-fields. :RE Czytać https://github.com/Hipo/drf-extra-fields po więcej szczegółów.