gpt4 book ai didi

python - 将 upload_to 函数与模型类关联的首选 pythonic 方式?

转载 作者:太空宇宙 更新时间:2023-11-03 19:11:58 25 4
gpt4 key购买 nike

我的类(class)有 Django ImageField我一直在努力在两种存储该字段的替代方案之间做出决定 upload_to功能。第一种方法非常简单。该函数在模块级别定义(参见 https://stackoverflow.com/a/1190866/790075https://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装饰器(参见 https://stackoverflow.com/a/9264153/790075 ),但我发现当我这样做时,该函数永远不会执行,文件名最终看起来像: /path/to/file/<classmethod object> ,方法对象嵌入在文件路径中,这当然不是有意的!

以下哪种模式是首选模式?有更好的办法吗?

最佳答案

我建议您:

import this

对我来说,这属于Zen of Python的部分指出:

Simple is better than complex.
Complex is better than complicated.

我认为你的简单解决方案更好。但是,你的情结并不感觉过于复杂。我想无论哪种方式你都可能会没事。只是我的两分钱。

关于python - 将 upload_to 函数与模型类关联的首选 pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com