2017-07-03 29 views
0

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は常に ''を返します。どうやら私は間違った方向に行きました。

答えて

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 

それは働いている。