django - 具有另一个字段作为参考的自定义字段

时间:2013-11-12 21:02:47

标签: django django-models

我有一个自定义字段,其中有一个图像字段作为参考,我使用我的字段如下:

 poster = ImageField(upload_to=get_path, null=True, blank=True )
 cropping = CropField('poster')#this is my custom field

现在我需要一种方法来监听引用的图像字段变化......我想我可以在models.py中使用信号,但我需要一种干燥的方式。我不想为每个具有裁剪自定义字段的模型发出信号。

我想我需要一种方法在自定义字段代码中执行此操作。但是哪里?在FieldDescriptor?在FieldCreator?

1 个答案:

答案 0 :(得分:0)

如果要确定模型的基础属性是否已更改,可以覆盖save方法以进行检查。这个answer描述了如何做到这一点。

要使其可用于具有CropField的任何模型,您可以为使用CropField的模型创建抽象基类

class CropFieldModel(models.Model):

    def save(self, *args, **kwargs):
        #logic to determine which field is an imageField.
        attrs = dir(self)
        for attr in attrs:
            if isisntance(attr, CropField):
                #whatever logic you want to to modify the object
        super(CropFieldModel, self).save(*args, **kw)

    class Meta:
        abstract = True

然后,使用CropField的所有模型都可以只是CropFieldModel的子类,您将获得自定义保存功能。

class MyModel(CropFieldModel):
    poster = ImageField(upload_to=get_path, null=True, blank=True )
    cropping = CropField('poster')

这样,您就不必重复自己,并在模型实例发生变化时为您提供自定义逻辑。如果希望每个模型在更改时具有不同的行为,也可以使用getattr来调用子类中定义的函数。我不确定您要使用自定义字段完成什么,但希望这可以指出您在创建自定义模型和字段方面的正确方向。