根据Django中的模型名称动态更改上传位置

arc*_*123 4 django

我有这个模型:

class Photos (models.Model):
    file = models.ImageField()
    description = models.CharField(max_length=255, blank=True)
    Purpose = models.CharField(default='None', max_length=10)
    uploaded_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = 'photo'
        verbose_name_plural = 'photos'

    def __str__(self):
        return self.description
Run Code Online (Sandbox Code Playgroud)

这个模型包含所有上传到网站的照片。我还有其他三个模型引用它:

class Member(Models.Model):
     ...(various fields)
     Photos = models.ManytoManyForeignKey(Photos)

class Unit(models.Model):
     ...(various fields)
     Photos = models.ManytoManyForeignKey(Photos)

class avatar(models.Model):
     ...(various fields)
     Photos = models.ForeignKey(Photos)
Run Code Online (Sandbox Code Playgroud)

我的问题是文件所在的位置。我知道我可以uploaded-to:在 PHotos 类中添加参数,但是有没有一种方法可以根据引用模型专门指定要转到的文件夹?

例如uploaded-to: '/avatars/'当班级头像订婚时?或/Member-Photos/成员类的文件夹?

sch*_*tte 6

你可以因为upload_to可以接受一个函数。所以基本上,你可以使用类似的东西,

def upload_location(instance, filename):
    return os.path.join('/media/%s/' % instance.__class__.__name__, filename) 

class Photos (models.Model):
    file = models.ImageField(upload_to=upload_location)
    ...
Run Code Online (Sandbox Code Playgroud)

这将动态添加你的模型类的名称(例如avatarMember等)。

编辑

如果您想根据模型实例自定义返回的名称,我会创建一个dict映射这些值的名称。

path_mapping = {'avatars':'avatars','Member':'Member-Photos'}

def upload_location(instance, filename):
    try:
        path = path_mapping[instance.__class__.__name__]
    except KeyError:
        path = 'Unknown'
    return os.path.join('/media/%s/' %path , filename) 

class Photos (models.Model):
    file = models.ImageField(upload_to=upload_location)
    ...
Run Code Online (Sandbox Code Playgroud)

请注意,这不是实现这一目标的唯一方法。我只是觉得它可维护和可读。如果您没有在映射中实现自定义路径dict'Unknown'将使用。