我有这个模型:
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
此模型包含所有上传到网站的照片。我还有其他三个引用它的模型:
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)
我的问题是文件位于何处。我知道我可以在PHotos类中添加uploaded-to:
参数,但是有没有一种方法可以根据引用模型专门指定要转到哪个文件夹?
如uploaded-to: '/avatars/'
?或进入Members类的/Member-Photos/
文件夹?
答案 0 :(得分:4)
自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)
...
这将动态添加模型的类名(例如avatar
,Member
等)
编辑
如果您想根据模型实例自定义返回的名称,我将创建一个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)
...
请注意,这不是实现此目的的唯一方法。我只是觉得它可维护且可读。如果您未在映射dict
中实现自定义路径,则将使用'Unknown'
。