在Django模型中覆盖Field属性

时间:2017-12-19 18:44:02

标签: python django django-models

我有问题。我正在尝试使用FileField的upload_to属性更改文件上传的目录,但没有成功。

主要问题是我已经定义了一个带有文件属性的父类,我想更改子类的目录。

我的模型以这种方式定义:

class DocumentBase(models.Model):
    file = models.FileField(upload_to=get_filename)


class Document(DocumentBase):
    file_type = models.CharField(max_size=150)

我试图覆盖子类中的FileField,但没有成功(我现在知道这是不可能的。)

我也尝试了这个other question的答案(这与我的问题非常相似),没有成功。

有人可以帮我这个吗?谢谢!

1 个答案:

答案 0 :(得分:1)

正如Willem所说,猴子修补upload_to属性可以解决这个问题。但它对这种情况并不起作用。

深入研究FileField class definition,此课程还有另一个属性:generate_filename。当upload_to可调用时,将填充此属性。 此属性用于生成文件filename。

所以,有效的解决方案是:

class DocumentBase(models.Model):
    file = models.FileField(upload_to=get_filename)


class Document(DocumentBase):
    file_type = models.CharField(max_size=150)

Document._meta.get_field('file').generate_filename = other_get_filename

这种行为在Django 1.10上发生了变化。