我有一个带有Django ImageField的类,我一直在努力在两种存储该字段upload_to
功能的替代方案之间做出决定。第一种方法非常简单。该函数在模块级别定义(参见 https://stackoverflow.com/a/1190866/790075,https://stackoverflow.com/a/3091864/790075):
def get_car_photo_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext) # chance of collision <1e-50
return os.path.join('uploads/cars/photos', filename)
class CarPhoto(models.Model):
photo = models.ImageField(upload_to=get_car_photo_file_path)
这简单易懂,但是通过添加一个实际上只与 CarPhoto 类相关的函数来污染模块范围。
在第二种方法中,我使用可调用类模式将函数与 CarPhoto 类更紧密地关联起来。这将upload_to
功能移出模块范围,但感觉不必要地复杂。
class CarPhoto(models.Model):
class getCarPhotoFilePath():
# Either use this pattern or associate function with module instead of this class
def __call__(self, instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext) # chance of collision <1e-50
return os.path.join('uploads/cars/photos', filename)
photo = models.ImageField(upload_to=getCarPhotoFilePath())
我已经看到了使用@staticmethod
and@classmethod
装饰器的建议(参见https://stackoverflow.com/a/9264153/790075),但我发现当我这样做时,函数永远不会执行,并且文件名最终看起来像:/path/to/file/<classmethod object>
,使用方法嵌入在文件路径中的对象,这当然不是故意的!
以下哪个是首选模式?有没有更好的办法?