【问题标题】:How to use primary key id in the name of uploaded file/image?如何在上传的文件/图像的名称中使用主键 ID?
【发布时间】:2009-06-21 19:16:45
【问题描述】:

我需要生成带有掩码的上传图片的名称

images/{{ uploaded_image.id }}.jpg

我认为最好的方法是 FileField.upload_to 属性,但它写成Here:

在大多数情况下,这个对象还没有保存到数据库中,所以如果它使用默认的 AutoField,它可能还没有主键字段的值。

在我的情况下,在 save() 方法中保存对象后重命名文件会更好吗?

【问题讨论】:

    标签: django


    【解决方案1】:

    我所做的是给 upload_to 一个函数,然后分配一个 UUID 是它保存到的函数:

    import uuid
    
    def get_upload_to(instance, filename):
        instance.uuid = uuid.uuid4().hex
        return 'blah/%s/%s' % (instance.uuid, filename)
    
    class Photo(models.Model):
        file = models.FileField(max_length=200,upload_to=get_upload_to)
        uuid = models.CharField(max_length=32)
    

    【讨论】:

    • 这不是在回答问题。 UUID 与实例的 PK 不同。
    【解决方案2】:

    为避免并发问题,您需要在确定文件名之前将对象存储到数据库中(因为即使您获得下一个增量 id,这是可能的,它可能会在您保存文件时更改。)所以存储对象,然后重命名文件。

    【讨论】:

      【解决方案3】:

      谢谢,Blixt 和 Todd!我为我的问题选择了更好的解决方案:

      import time
      class Image(models.Model):
          def _get_upload_to(instance, filename):
              return 'images/%f.jpg' % time.time()
      
          original = models.ImageField(upload_to=_get_upload_to, ....)
      

      保证每个文件名在同一目录中都是唯一的。在我的情况下,我只需要 jpg 文件,所以在其他情况下可以替换原始扩展名

      【讨论】:

      • 作为警告,如果您提交图像的速度过快,您可能会遇到问题。
      • time.time() 返回浮点值 - 秒和秒的分数,如“images/1245720125.783708.jpg”。我认为在这种情况下永远不会出现两个同名的情况。
      猜你喜欢
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2018-12-25
      • 2016-11-30
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多