Django - Как правильно получить загрузку нескольких изображений через POST?
У меня есть этот view.py
и models.py
файлы ниже, которые должны поддерживать загрузку нескольких изображений. У меня есть тесты, которые работают и действительно генерируют изображения, но изображения прикрепляются к POST-запросу в формате ByteIO. Я хочу, чтобы эта конечная точка получала POST-запрос от React Native front-end, содержащий изображение, и я не знаю, будет ли оно в формате ByteIO. Я попробовал отправить изображение в байтовом формате, сделав
with open('./media/test.png', 'rb') as f:
image = f.read()
Но это по какой-то причине превращает QueryDict, который является request.data
, в неизменяемый dict. Как вы можете видеть ниже, это является проблемой, когда я изменяю его. Правильно ли то, как я это реализовал, для получения нескольких загруженных изображений из React Native?
view.py
class PostView(APIView):
def post(self, request):
post_body = request.data['body']
hash_tags_list = extract_hashtags(post_body)
hash_tags = [HashTag.objects.get_or_create(
hash_tag=ht)[0].hash_tag for ht in hash_tags_list]
request.data['hash_tags'] = hash_tags
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
try:
post_obj = serializer.save()
if 'images' in request.FILES.keys():
for img in request.FILES.getlist('images'):
Photo.objects.create(post_id=post_obj, image=img)
except django.db.utils.InternalError as e:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
models.py
class Post(AbstractBaseModel):
creator_id = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator_id")
goal_id = models.ForeignKey(Goal, on_delete=models.CASCADE)
body = models.CharField(max_length=511, validators=[MinLengthValidator(5)])
hash_tags = models.ManyToManyField(HashTag)
def directory_path(instance, filename):
_, extension = os.path.splitext(filename)
return 'images/user_{0}/{1}'.format(instance.post_id.creator_id.uuid, str(instance.uuid) + extension)
class Photo(AbstractBaseModel):
post_id = models.ForeignKey(Post, on_delete=models.CASCADE)
image = models.ImageField(upload_to=directory_path)