覆盖django中的FieldFile对象

时间:2011-12-19 11:29:44

标签: python django django-models

如何轻松地向ImageFieldFile对象添加自定义属性或方法?

例如我有这个模型:

class SomeModelWithImage(models.Model):
    image = models.ImageField()

和一个班级:

class Custom(object):

    def __repr__(self):
        return "<Custom object>"    

我想以某种方式覆盖ImageFieldFile对象,因此它将有一个返回我的Custom对象的计算方法,如:

>> from models import SomeModelWithImage
>> i = SomeModelWithImage.objects.all()[0]
>> i.image
   <ImageFieldFile: /path/to/file>
>> i.image.custom_text
   <Custom object>

UPD。我更改了一些对象名称,使问题抽象化并且不会让您感到困惑

1 个答案:

答案 0 :(得分:0)

在Django中,一个模型字段始终对应于一个数据库列,因此您无法实现所需。此外,您的类名应始终是单数,因为“Image”类的对象应该只是一个单独的图像。我想你可能想要更像以下内容:

class ImageSet(models.Model):
    images = models.ManyToManyField('Image')

class Image(models.Model):
    image_file = models.ImageField()
    custom_text = models.CharField(max_length=255)

修改

如果你想要一个不需要额外数据库信息的计算字段/方法,只需要子类models.ImageField:

class MyImageField(models.ImageField):
    my_class_attr = "BLARG"

    def my_method(self):
        print self.my_class_attr