Сохранить изображение с URL Django Rest Framework - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь сохранить изображение из URL в запросе на публикацию.

Вот то, что у меня есть, ошибка при передаче файла в сериализатор.

#models.py
class Picture(models.Model):
    picture = models.ImageField(
        upload_to=upload_location_picture, max_length=255
    )
    owner = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='owned_pictures')

#views.py
class PlanPostPictureByUrl(APIView):
    '''
    Class to post dislike to plan
    '''
    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request, format=None):
        img_url = request.data["picture"]
        name = urlparse(img_url).path.split('/')[-1]
        response = requests.get(img_url)
        if response.status_code == 200:
            serializer = PlanPicturesSerializer(
                data={"picture":ContentFile(response.content)})
        if serializer.is_valid():
            serializer.save(owner=self.request.user)
            return Response(status=status.HTTP_201_CREATED)
        return Response(status=status.HTTP_400_BAD_REQUEST)


#serializers.py
class PlanPicturesSerializer(serializers.ModelSerializer):

    class Meta:
        model = Picture
        fields = ['picture']

Это ошибка, которую я получаю от сериализатора:

{'picture': [ErrorDetail(string='No filename could be determined.', code='no_name')]}

1 Ответ

0 голосов
/ 26 марта 2020

У меня есть что-то подобное в моих сериализаторах create и update методов.

from django.core.files.uploadedfile import UploadedFile

url = validated_data['newIconFromURL']
# Remove url from the submitted data
validated_data['newIconFromURL'] = ''
# Download data from url (requires `requests` module.  Can also be done with urllib)
response = requests.get(validated_data['newIconFromURL'])
# Set icon field (ImageField) to binary file
validated_data['icon'] = UploadedFile(BytesIO(response.content), name='icon')

Обратите внимание, что имя файла не обязательно должно быть уникальным, так как Django будет добавлять случайные символы к фактическое имя файла, чтобы сделать его уникальным.

...