Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
首选pythonic方式将upload_与模型类关联?_Python_Django_Django Models - Fatal编程技术网

首选pythonic方式将upload_与模型类关联?

首选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

我有一个带有a的类,我一直在努力选择两种方法来存储该字段的
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)