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()ます。の属性への割り当ては、挿入する SQL で最初のパラメーターを生成した後であることがわかります。したがって、割り当ては生成された SQL では有効にならず、インスタンス自体にのみ影響します。FileFieldfilenameupload()filename

それが問題でない場合は、シェルで入力したコードを投稿してください。

于 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 に答える