Django FileField上传到自定义函数错误


我为DjangoFileFieldupload_to参数创建了一个自定义实用程序函数。此函数接受前缀并返回一个实际接受instancefilename的函数。但是当我运行manage.py makemigrations时,命令抛出ValueError。我已将相关文件/数据包含在下面。

secret_upload功能

import uuid
def secret_upload(prefix):
def _path(instance, filename):
file = filename.split(".")
fuuid = uuid.uuid4()
if len(file) == 1:
filename = f"secrets/{prefix}/{file[0]}-{fuuid}"
elif len(file) == 2:
filename = f"secrets/{prefix}/{file[0]}-{fuuid}.{file[1]}"
return filename
return _path

Django模型

class SecretData(models.Model):
name = models.CharField(max_length=100)
secret_file = models.FileField(upload_to=secret_upload("files"))

makemigrations错误回溯

(most recent call last):
File "D:Pythonprojectskeep-credskeep_credsmanage.py", line 22, in <module>
main()
File "D:Pythonprojectskeep-credskeep_credsmanage.py", line 18, in main
execute_from_command_line(sys.argv)
File "D:Pythonprojectskc-venvlibsite-packagesdjangocoremanagement__init__.py", line 425, in execute_from_command_line
utility.execute()
File "D:Pythonprojectskc-venvlibsite-packagesdjangocoremanagement__init__.py", line 419, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "D:Pythonprojectskc-venvlibsite-packagesdjangocoremanagementbase.py", line 373, in run_from_argv
self.execute(*args, **cmd_options)
File "D:Pythonprojectskc-venvlibsite-packagesdjangocoremanagementbase.py", line 417, in execute
output = self.handle(*args, **options)
File "D:Pythonprojectskc-venvlibsite-packagesdjangocoremanagementbase.py", line 90, in wrapped
res = handle_func(*args, **kwargs)
File "D:Pythonprojectskc-venvlibsite-packagesdjangocoremanagementcommandsmakemigrations.py", line 190, in handle
self.write_migration_files(changes)
File "D:Pythonprojectskc-venvlibsite-packagesdjangocoremanagementcommandsmakemigrations.py", line 227, in write_migration_files
migration_string = writer.as_string()
File "D:Pythonprojectskc-venvlibsite-packagesdjangodbmigrationswriter.py", line 141, in as_string
operation_string, operation_imports = OperationWriter(operation).serialize()
File "D:Pythonprojectskc-venvlibsite-packagesdjangodbmigrationswriter.py", line 99, in serialize
_write(arg_name, arg_value)
File "D:Pythonprojectskc-venvlibsite-packagesdjangodbmigrationswriter.py", line 63, in _write
arg_string, arg_imports = MigrationWriter.serialize(_arg_value)
File "D:Pythonprojectskc-venvlibsite-packagesdjangodbmigrationswriter.py", line 271, in serialize
return serializer_factory(value).serialize()
File "D:Pythonprojectskc-venvlibsite-packagesdjangodbmigrationsserializer.py", line 201, in serialize
return self.serialize_deconstructed(path, args, kwargs)
File "D:Pythonprojectskc-venvlibsite-packagesdjangodbmigrationsserializer.py", line 88, in serialize_deconstructed
arg_string, arg_imports = serializer_factory(arg).serialize()
File "D:Pythonprojectskc-venvlibsite-packagesdjangodbmigrationsserializer.py", line 160, in serialize
raise ValueError(
ValueError: Could not find function _path in credentials.utils.

这背后可能的原因是什么?因为_path是在内部定义的。

Django为了创建迁移文件而试图序列化Model时会出现问题。

如果你看看django/db/migrations/serializer.py内部,你会看到以下内容:

if '<' not in self.value.__qualname__:  # Qualname can include <locals>
return '%s.%s' % (module_name, self.value.__qualname__), {'import %s' % self.value.__module__}

raise ValueError(
'Could not find function %s in %s.n' % (self.value.__name__, module_name)
)

这意味着不能使用本地函数。

最新更新