首选pythonic方式将upload_与模型类关联?
我有一个带有a的类,我一直在努力选择两种方法来存储该字段的首选pythonic方式将upload_与模型类关联?,python,django,django-models,Python,Django,Django Models,我有一个带有a的类,我一直在努力选择两种方法来存储该字段的upload\u to函数。第一种方法非常简单。该函数在模块级(c.f.)上定义: 我看到过使用@staticmethod和@classmethod装饰器(c.f.)的建议,但我发现当我这样做时,函数永远不会执行,文件名最终看起来像:/path/to/file/,方法对象嵌入到文件路径中,这当然不是有意的 以下哪一种是首选模式?有更好的方法吗?我建议您: import this 对我来说,这属于《宪法》的一节,其中规定: Simple
upload\u to
函数。第一种方法非常简单。该函数在模块级(c.f.)上定义:
我看到过使用@staticmethod
和@classmethod
装饰器(c.f.)的建议,但我发现当我这样做时,函数永远不会执行,文件名最终看起来像:/path/to/file/
,方法对象嵌入到文件路径中,这当然不是有意的
以下哪一种是首选模式?有更好的方法吗?我建议您:
import this
对我来说,这属于《宪法》的一节,其中规定:
Simple is better than complex.
Complex is better than complicated.
我认为你的简单解决方案更好。但是,你的情结并不觉得过于复杂。我想你可能会没事的。只要我的两分钱。有一个命名约定来防止名称污染
- 使用
将您的函数标记为内部函数(尽管未隐藏)李>\u get\u car\u photo\u file\u path
- 使用
从课堂外访问它\u获取\u汽车\u照片\u文件\u路径
CarPhoto
类中添加这样的classmethod或staticmethod,这比添加可调用类更简单(后者让我想起Java为了一个方法而定义匿名类的方法)
该名称将清楚地显示
\u get\u car\u photo\u file\u path
是一个实现细节,而不是接口的一部分,从而防止类的命名空间受到污染。作为CarPhoto
的方法,该函数不会污染模块的名称空间。目前在我正在使用的代码中,我们有一个最简单的方法的变体。唯一的区别是,由于该函数是供内部使用的,因此它用\uuu
前缀标记为内部使用
def _get_car_photo_file_path(instance, filename):
[...]
class CarPhoto(models.Model):
photo = models.ImageField(upload_to=_get_car_photo_file_path)
然而,我相信这会更具python风格(或者更确切地说是OOP):
这是真的,但您建议我如何将其用于上述任何一种情况?不幸的是,这种方法失败了。看看我对@vartec建议的回应。我希望有更具体的东西,但我不能说我不同意你的意见!很抱歉我试图非常具体地说,我认为简单的解决方案(第一个)更好。原因是我认为它更接近于“Python的禅宗”。但是,可调用的解决方案并不可怕。我只是稍微喜欢第一个。顺便说一句,您可以避免完全定义函数/方法/类,并将
get\u car\u photo\u file\u path
转换为ImageField
调用中的内联lambda。但这可能完全不可读。第二个建议是我第一次尝试的,但这失败了,因为您无法访问CarPhoto
(类)或self
。请参阅注释@turtlemonvh:static方法不需要self
@turtlemonvh:I无法看到如何在计算文件路径的函数中使用类的self
。实例
参数从未在您的帖子中的函数中使用。@vartec True,但它确实需要类,而类也不需要available@9000这是正确的:我没有在函数中使用self
。文件名作为uuid生成,不基于文件本身的任何属性派生。我的观点不是说我需要self
来完成函数的工作,而是调用staticmethod
或classmethod
需要访问self
或self.\uu class
,两者都不可用。
Simple is better than complex.
Complex is better than complicated.
def _get_car_photo_file_path(instance, filename):
[...]
class CarPhoto(models.Model):
photo = models.ImageField(upload_to=_get_car_photo_file_path)
class CarPhoto(models.Model):
@staticmethod
def _get_file_path(instance, filename):
[...]
photo = models.ImageField(upload_to=_get_file_path)