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
这是有效的。