Python& Django,UUID不是唯一的

时间:2014-08-14 11:02:02

标签: django uuid

我正在使用Django开发一个应用程序。我有一个表单,用户上传3个不同的文件(至少一个)。然后将这些文件发送到生成一些结果文件的主脚本。我想将所有这些文件存储在一个目录中,每个目录名称都由表单提交唯一。我在互联网上环顾四周,找到了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 import upload_to    class Analysis(models.Model):       structureFile = 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模块,但我遇到了同样的问题。我试图刷新网页并删除co​​okie,但没有任何效果。

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

提前致谢

3 个答案:

答案 0 :(得分:0)

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

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

所以有步骤,上传应该如何:

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

答案 1 :(得分:0)

来自upload_to文档:

  

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

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

答案 2 :(得分:0)

我在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并在每个表单提交时生成!