Django не может установить атрибут при изменении url медиафайла
Я создаю функцию, в которой я хочу, чтобы каталог файла менялся, если меняется image_type, например, если image_type это aerial_view, то он должен быть в одной папке, а если это detailed_view, то он должен переместиться в другую.
Файл успешно перемещается, однако я сталкиваюсь с can't set attribute при изменении url изображения.
Я не уверен, что это лучший способ изменить папку файла MEDIA, я хотел бы получить предложения, если есть лучший способ.
def post(self, request):
image_ids = dict((request.data).lists())['image_id']
image_types = dict((request.data).lists())['image_type']
arr = []
for img_id, img_type in zip(image_ids, image_types):
image_qs = RoofImages.objects.get(id=img_id)
image_qs.image_type = img_type
print(BASE_DIR)
try:
if image_qs.image_type == 'detailed_view':
full_image_url = f'{BASE_DIR}{image_qs.image.url}'
full_new_image_url = full_image_url.replace('aerial_view', 'detailed_view')
shutil.move(full_image_url, full_new_image_url)
image_qs.image.url = str(image_qs.image.url).replace('aerial_view', 'detailed_view')
except Exception as e:
print(e)
try:
if image_qs.image_type == 'aerial_view':
full_image_url = f'{BASE_DIR}{image_qs.image.url}'
full_new_image_url = full_image_url.replace('detailed_view', 'aerial_view')
shutil.move(full_image_url, full_new_image_url)
image_qs.image.url = str(image_qs.image.url).replace('detailed_view', 'aerial_view')
except Exception as e:
print(e)
arr.append({img_id: img_type})
image_qs.save()
response_content = {
'status': True,
'message': 'Images type change successfully.',
'result': arr
}
return Response(response_content, status=status.HTTP_201_CREATED)
Немного погуглив, мы можем изменить атрибут, используя instance.field.name вместо instance.field.url.
try:
if image_qs.image_type == 'detailed_view':
full_image_url = f'{BASE_DIR}{image_qs.image.url}'
full_new_image_url = full_image_url.replace('aerial_view', 'detailed_view')
shutil.move(full_image_url, full_new_image_url)
new_image_url = str(image_qs.image.url).replace('aerial_view', 'detailed_view')
image_qs.image.name = new_image_url
except Exception as e:
print(e)
try:
if image_qs.image_type == 'aerial_view':
full_image_url = f'{BASE_DIR}{image_qs.image.url}'
full_new_image_url = full_image_url.replace('detailed_view', 'aerial_view')
shutil.move(full_image_url, full_new_image_url)
new_image_url = str(image_qs.image.url).replace('detailed_view', 'aerial_view')
image_qs.image.name = new_image_url
except Exception as e:
print(e)