如何在django中保存一个以对象id命名的文件夹中的图像?

时间:2018-02-13 21:01:51

标签: django

我有一个django后端:

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

models.py

def portada_inmueble_path(instance, file_name):
    print('ID', instance.pk) // Here the id or pk is None
    return '{}/{}/{}'.format(
        instance.inmobiliaria.id,
        instance.pk,
        file_name)


class Inmueble(models.Model):
...
portada = models.ImageField(upload_to=portada_inmueble_path, blank=True,
                                null=True, max_length=99)
...

signals.py

@receiver(signals.pre_save, sender=Inmueble)
def inmueble_pre_save(sender, instance, **kwargs):
    new_file = instance.portada
    try:
        old_file = Inmueble.objects.get(pk=instance.pk).portada
        if not old_file == new_file:
            if os.path.isfile(old_file.path):
                os.remove(old_file.path)
    except:
        pass

我需要像这样命名文件路径:

/media/inmobiliaria_id/inmueble_id/portada.jpg

我的问题是路径中不存在inmueble(属性)的id,因为它尚未创建。如何获取ID并使用该名称创建文件夹?

由于

1 个答案:

答案 0 :(得分:0)

如上所述,在保存ID之前,您无法拥有该ID,因为ID将由数据库生成,您无法控制它。

一些选项:

  • 首先在没有图像的情况下进行保存,然后获取id,制作目录,然后添加图像并更新行。

(快速,干净,不需要太多代码。在添加图像之前可能会出现一些问题(如服务器崩溃,这种情况很少见,但可能会发生。)

  • 保存所有内容,然后更改图像位置。

(它基本上像第一个选项,但反过来。需要更多代码,需要处理文件。仍然可能存在服务器崩溃等问题)

  • 您可以创建自定义唯一ID并在保存时生成它,并将其用作路径的ID。

(在我看来,最好的选择,不需要太多的代码(只是检查生成的ID是否已经存在)。非常干净,一切都没有需要任何更新,你不会遇到问题,如服务器崩溃。