我有一个自定义字段,其中有一个图像字段作为参考,我使用我的字段如下:
poster = ImageField(upload_to=get_path, null=True, blank=True )
cropping = CropField('poster')#this is my custom field
现在我需要一种方法来监听引用的图像字段变化......我想我可以在models.py中使用信号,但我需要一种干燥的方式。我不想为每个具有裁剪自定义字段的模型发出信号。
我想我需要一种方法在自定义字段代码中执行此操作。但是哪里?在FieldDescriptor?在FieldCreator?
答案 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
来调用子类中定义的函数。我不确定您要使用自定义字段完成什么,但希望这可以指出您在创建自定义模型和字段方面的正确方向。