【发布时间】:2012-10-01 14:07:04
【问题描述】:
我有一个带有Django ImageField 的类,我一直在努力在存储该字段的upload_to 函数的两种选择之间做出决定。第一种方法非常简单。该函数在模块级别定义(c.f. 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 和 @classmethod 装饰器的建议(c.f. https://stackoverflow.com/a/9264153/790075),但我发现当我这样做时,函数永远不会执行并且文件名最终看起来像:/path/to/file/<classmethod object>,与文件路径中嵌入的方法对象,这当然不是故意的!
以下哪一个是首选模式?有没有更好的办法?
【问题讨论】:
-
顺便说一句,您可以避免完全定义函数/方法/类,并将您的
get_car_photo_file_path转换为ImageField调用中的内联 lambda。但这可能完全不可读。
标签: python django django-models