【问题标题】:Python & Django, UUID not uniquePython & Django,UUID 不是唯一的
【发布时间】:2014-08-14 11:02:02
【问题描述】:

我正在使用 Django 开发一个应用程序。我有一个表单,用户可以在其中上传 3 个不同的文件(至少一个)。然后将这些文件发送到生成一些结果文件的主脚本。我想将所有这些文件存储在一个目录中,每个目录名称在表单提交时都是唯一的。我在 Internet 上环顾四周,发现了 UUID 技术。我安装了名为 django-uuid-upload-path 的 Django 模块。但是当我提交表单时,它总是返回相同的 uuid,看起来像一个 UUID 字符串。这是我使用此模块的模型:

from django.db import models
from uuid_upload_path import uuid
class Analysis(models.Model):
    uidDir = uuid()
    dirFile = 'documents/%Y/%m/%d/' + str(uidDir)
    structureFile = models.FileField(upload_to = dirFile)

我尝试以这种方式使用此模块中的upload_to:

从 uuid_upload_path 导入 upload_to 类分析(模型。模型): 结构文件 = models.FileFiels(upload_to = upload_to)

我已经为我的 3 个 FileFields 完成了此操作,它在一个表单提交中为我提供了 3 个不同的 UUID。现在的问题是我的文件不在同一个目录中。

这是我的控制器,我上传用户提交的文件:

def analysis(request):
    if request.method == 'POST':
        documents = Analysis.objects.all()
        form = AnalysisForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Analysis(structureFile = request.FILES['structureFile'])
            newdoc.save()

我尝试过使用 Python 中的 uuid 模块,但遇到了同样的问题。我尝试刷新网页并删除 cookie,但没有任何效果。

P.S : 我在 OS X 10.9.4 上使用 Safari。

提前致谢

【问题讨论】:

  • 如果你让一个类变量等于uuid(),当模块被加载时,函数将只运行一次

标签: django uuid


【解决方案1】:

我认为您不应该在模型部分硬编码您的 UUID。 Django ORM 会在创建数据库时使用一次。

在您的模型中,您应该使用 UUID 保留字段,但此 UUID 应在上传文件时在 views.py 中生成。

所以有步骤,上传应该是什么样子:

  1. 你觉得形式和发送它。
  2. 您的控制器获取包含数据的表单。
  3. 在控制器中生成 UUID
  4. 您的控制器将数据保存在数据库中(您应该在数据库中存储文件路径以及生成的 UUID)

【讨论】:

  • 您知道如何完成最后一步吗?我不知道如何获取模型的 UUID 字段的值并将其提供给我的文件字段?
【解决方案2】:

来自upload_to 文档:

这也可能是callable,比如函数,会被调用 获取上传路径,包括文件名。这个可调用的必须 能够接受两个参数,并返回一个 Unix 风格的路径(使用 正斜杠)传递给存储系统。他们俩 将被传递的参数是:

您需要做的是创建这个 uuid 函数并将其传递给upload_to

【讨论】:

  • 因为我有 3 个上传的文件,我会不会有和以前一样的问题 3 个不同的目录?
【解决方案3】:

我在 Django 的邮件列表中找到了答案。以下是获取字段值的方法:

def dir_file(analysis, file_name):  # should live outside your model
    return 'documents/%s/%s' % ( analysis.uuidDir, file_name)

在模型中,你输入:

uuidDir = models.CharField(max_length = 36)
structureFile = models.FileField(upload_to = dir_file)

现在我的目录是 UUID 并在每次提交表单时生成!

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2022-11-18
    • 2011-07-30
    相关资源
    最近更新 更多