Django自定义FileField属性和属性

问题描述:

我想向FileField添加一个属性,以便我可以指定何时向模型添加一个字段。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总是返回''。显然我走错了路。

今天,我清醒地认识了更多的来源。最后,事实证明:

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 

这是有效的。