ImageFile не работает, не знаю, в чем проблема в
Я пытаюсь загрузить картинку, но ничего не получается. Никакой ошибки не возвращается, вроде если она загружена и отпечатки self.validated_data['picture'] или serializer.self.validated_data['picture'] не пустые, но 'picture' в JSON остается null - так не должно быть. Ничего не загружается в медиафайлы, ничего нет в DB
Виды
@api_view(['GET', 'POST'])
def api_pictures(request):
if request.method == 'GET':
pictures = Picture.objects.all()
serializer = PictureSerializer(pictures, many=True)
return JsonResponse(serializer.data, safe=False)
if request.method == 'POST':
serializer = PictureSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
print(serializer.validated_data['picture'])
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
#Модели
class Picture(models.Model):
pic_name = models.CharField(max_length=255, blank=True)
picture =models.ImageField(upload_to='media_site/',blank=True,
height_field='height', width_field='width')
url = models.URLField(blank=True, null=True, max_length=500)
height = models.IntegerField(blank=True, null=True)
width = models.IntegerField(blank=True, null=True)
#Urls
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include(router.urls)),
path("api/images/", api_pictures),
path("api/images/<int:pk>", detail_pictures),
]
#Serializers.py
class PictureSerializer(serializers.ModelSerializer):
@staticmethod
def name_parser(object_name):
parser = re.search(r'[^/]*$', str(object_name))
return parser[0]
def save(self):
if 'picture' not in self.validated_data.keys():
url = self.validated_data['url']
result = urllib.request.urlopen(url=url)
img = BytesIO(result.read())
converted_img = InMemoryUploadedFile(img, None, self.name_parser(url),
'image/jpeg', sys.getsizeof(img), None)
print(converted_img)
self.validated_data.update({'picture': converted_img})
else:
self.validated_data.update({'picture': self.validated_data['picture']})
if 'pic_name' not in self.validated_data.keys():
name = self.name_parser(self.validated_data['picture'])
self.validated_data.update({'pic_name': name})
class Meta:
model = Picture
fields = ('id', 'pic_name', 'picture', 'url', 'width', 'height', 'parent_picture')
результат
Но 'picture' не должно быть null :((((
Когда я загружаю его, self.validated_data['picture'] не пуст. Django не выдает ошибку.
Я нашел решение, я должен был инициализировать super.save()
после переопределения функции в PictureSerializer
классе.