如何创建一个名为字段的 upload_to 文件夹,该文件夹属于同时创建的模型?

How can I create an upload_to folder that is named a field belonging to the model that is simultaneously being created?

上下文: 我正在使用 Django 3.1.4 构建一个汽车经销商应用程序,并尝试实现一项功能,每次创建新广告时, /media/ 中的新文件夹(通过 upload_to 方法)将仅包含新创建的广告的照片。

我已经使用日期格式(见下文)使这个工作有所改善,但我需要将这个新文件夹命名为属于模型的字段之一(见第二个代码片段)。

photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)

例如,每个新创建的广告都会使用标题字段..

class Vehicles(models.Model):
    CONDITION_CHOICES = [("Brand New","Brand New"),("Used", "Used")]
    FUEL_CHOICES = [("Petrol","Petrol"),("Diesel", "Diesel"),("Electric", "Electric"),("Hybrid", "Hybrid")]
    TRANSMISSION_CHOICES = [("Automatic","Automatic"),("Manual", "Manual")]
    title = models.CharField(max_length=200, default = "Ad Title & Folder Name")
    def folder_name(self, title):
        return self.title
    make = models.CharField(max_length=100)

理想情况下,媒体文件夹应该类似于

/media/
    Opel Astra VXR/
    Mercedes E200/

我知道很多其他人也做过类似的事情,但我发现的所有示例都使用 'user' 而我需要使用模型字段(属于正在创建的模型)作为文件夹名称.

结束语: 第二个代码片段中的函数只是我正在试用的东西。

此外,这仍在开发中,因此在生产中我完全打算将所有媒体定向到一个 S3 存储桶。

作为documented

upload_to may also be a callable, such as a function. This will be called to obtain the upload path, including the filename. This callable must accept two arguments and return a Unix-style path (with forward slashes) to be passed along to the storage system. The two arguments are:

  • 实例(定义文件字段的模型实例。)
  • 文件名(原先给文件的文件名)

For example:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

找到了解决方案并想 post 为下一个可能需要它的人提供。原来是我的格式化语法问题。这起到了作用,现在为每个广告及其照片打开一个新文件夹。它还使用添加到现有广告的任何新照片更新原始文件夹。

下面的标题和功能:

title = models.CharField(max_length=200, default = "Ad Title & Folder Name")
    def upload_photo_to(self, filename):
        return f'{self.title}/{filename}'

照片字段及其应用方式:

photo_1 = models.ImageField(upload_to=upload_photo_to, blank=True)