在 Django ImageField 中使用 id 更改上传文件名

Changing file name on upload using id in Django ImageField

在这个模型中,我想更改ImageField中上传文件的名称

class Product(models.Model):
    image = models.ImageField(upload_to=content_file_name)
    name = models.CharField(max_length=100)
    amount = models.PositiveIntegerField()

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return self.name

要更改图像的名称,我正在使用此功能

def content_file_name(instance, filename):
    ext = filename.split('.')[-1]
    filename = '%s.%s' % (instance.id, ext)

    return os.path.join('products', filename)

但我的图像名称是 None,如果我使用其他字段,如 'name',它会起作用。 id改名字怎么办?谢谢!

实例的 id 尚未创建,因为 新对象首次写入数据库之前调用了 upload_to 函数。

In most cases, this object will not have been saved to the database yet, so if it uses the default AutoField, it might not yet have a value for its primary key field.

来自 Django docs

的强调

两种选择:

使用 uuid.uuid4() 值,它易于创建并且与 pk 一样独特。

另外一个建议,如果你关心搜索引擎和SEO,使用slugify(instance.name)这样你的图片在搜索引擎的图片搜索中更容易被找到。