Django自定义FileField属性和属性

时间:2017-07-03 14:47:38

标签: django

我想在FileField中添加一个属性,以便我可以指定何时向模型添加字段。

class TestFile(models.Model):
    c206 = CategoryFileField(
        category='206'
    )

并从模型实例中获取相同的值。

tf = TestFile.objects.latest('id')
tf.c206.category # 206

我尝试使用ImageFileField类比扩展FileFiled:

class CategoryMetadataMixin(object):
    @property
    def category(self):
        return self.category


class CategoryFieldFile(CategoryMetadataMixin, FieldFile):
    pass


class CategoryFileField(FileField):
    attr_class = CategoryFieldFile
    descriptor_class = FileDescriptor
    description = _("File")

    def __init__(self, verbose_name=None, name=None, category='', **kwargs):
        self.attr_class.category = category
        super().__init__(verbose_name, name, **kwargs)

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        if self.category:
            kwargs['category'] = self.category
        return name, path, args, kwargs

但在这种情况下,category始终返回''。显然我走错了路。

1 个答案:

答案 0 :(得分:0)

今天心情清晰,我更仔细地研究了这些来源。最后,事实证明:

class CategoryFieldFile(FieldFile):
    @property
    def category(self):
        return self.field.category

    @category.setter
    def category(self, value):
        self.field.category = value


class CategoryFileField(FileField):
    attr_class = CategoryFieldFile
    descriptor_class = FileDescriptor
    description = _("File")

    def __init__(self, verbose_name=None, name=None, category='', **kwargs):
        self.category = category
        super().__init__(verbose_name, name, **kwargs)

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        if self.category:
            kwargs['category'] = self.category
        return name, path, args, kwargs

这是有效的。