13

我希望文件名是随机的,因此我使用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)

我该怎么做?

谢谢你。

4

3 回答 3

8

发布的代码正常工作,也许实际的代码是

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

注意上面字段顺序的切换。

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

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

于 2012-06-06T14:24:29.587 回答
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...
于 2012-06-05T23:40:32.393 回答
-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()
于 2012-06-05T23:50:45.400 回答