Django:如何在FileField中保存原始文件名?

时间:2012-06-05 22:07:09

标签: python django

我希望文件名是随机的,因此我使用upload_to函数返回一个随机文件名,如下所示:

from uuid import uuid4
import os
def get_random_filename(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (str(uuid4()), ext)
    return os.path.join('some/path/', filename)

# inside the model
class FooModel(models.Model):
    file = models.FileField(upload_to=get_random_filename)

但是我想将原始文件名保存到模型内的属性中。这样的事情不起作用:

def get_random_filename(instance, filename):
    instance.filename = filename
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (str(uuid4()), ext)
    return os.path.join('some/path/', filename)

# inside the model
class FooModel(models.Model):
    file = models.FileField(upload_to=get_random_filename)
    filename = models.CharField(max_length=128)

我该怎么做?

谢谢。

3 个答案:

答案 0 :(得分:8)

发布的代码通常有效,也许实际的代码是

class FooModel(models.Model):
    filename = models.CharField(max_length=128)
    file = models.FileField(upload_to=get_random_filename)

请注意切换上述字段的顺序。

这不会起作用,因为:当需要upload_to()的实际值时,pre_save()here in the code会调用FileField。您可以发现filename中属性upload()的赋值是在插入sql中生成第一个参数filename之后。因此,赋值不会在生成的SQL中生效,只影响实例本身。

如果不是问题,请发布您在shell中输入的代码。

答案 1 :(得分:1)

您可以在保存过程中使用填充文件名的路径。 显然,当你的get_random_filename运行时,你必须将原始文件名存储在内存中。

# inside the model
class FooModel(models.Model):
    file = models.FileField(upload_to=get_random_filename)
    filename = models.CharField(max_length=128)

    def save(self, force_insert=False, force_update=False):
        super(FooModel, self).save(force_insert, force_update)
            #Do your code here...

答案 2 :(得分:-1)

只需重新命令您的命令。 https://docs.djangoproject.com/en/dev/topics/db/models/

def save(self, *args, **kwargs):
        do_something()
        super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
        do_something_else()