【发布时间】:2009-06-21 19:16:45
【问题描述】:
我需要生成带有掩码的上传图片的名称
images/{{ uploaded_image.id }}.jpg
我认为最好的方法是 FileField.upload_to 属性,但它写成Here:
在大多数情况下,这个对象还没有保存到数据库中,所以如果它使用默认的 AutoField,它可能还没有主键字段的值。
在我的情况下,在 save() 方法中保存对象后重命名文件会更好吗?
【问题讨论】:
标签: django
我需要生成带有掩码的上传图片的名称
images/{{ uploaded_image.id }}.jpg
我认为最好的方法是 FileField.upload_to 属性,但它写成Here:
在大多数情况下,这个对象还没有保存到数据库中,所以如果它使用默认的 AutoField,它可能还没有主键字段的值。
在我的情况下,在 save() 方法中保存对象后重命名文件会更好吗?
【问题讨论】:
标签: django
我所做的是给 upload_to 一个函数,然后分配一个 UUID 是它保存到的函数:
import uuid
def get_upload_to(instance, filename):
instance.uuid = uuid.uuid4().hex
return 'blah/%s/%s' % (instance.uuid, filename)
class Photo(models.Model):
file = models.FileField(max_length=200,upload_to=get_upload_to)
uuid = models.CharField(max_length=32)
【讨论】:
为避免并发问题,您需要在确定文件名之前将对象存储到数据库中(因为即使您获得下一个增量 id,这是可能的,它可能会在您保存文件时更改。)所以存储对象,然后重命名文件。
【讨论】:
谢谢,Blixt 和 Todd!我为我的问题选择了更好的解决方案:
import time
class Image(models.Model):
def _get_upload_to(instance, filename):
return 'images/%f.jpg' % time.time()
original = models.ImageField(upload_to=_get_upload_to, ....)
保证每个文件名在同一目录中都是唯一的。在我的情况下,我只需要 jpg 文件,所以在其他情况下可以替换原始扩展名
【讨论】: