【发布时间】:2014-10-23 09:46:56
【问题描述】:
我正在尝试编写一个小函数来保存实例的图像字段。
def save_image_to_model(instance, **kwargs):
fieldname = kwargs.pop('fieldname')
imgpath = kwargs.pop('imgpath')
imagefile_name = urlparse(imgpath).path.split('/')[-1]
instance.fieldname.save(imagefile_name,
ContentFile(urllib2.urlopen(imgpath).read()))
instance.save()
但我得到了
'MyModel' object has no attribute 'fieldname'
我这样称呼它:
save_image_to_model(myinstance, fieldname='bg_image', imgpath='http://.../img.png')
我正在考虑使用getattr(instance, fieldname),但我不确定这是否正确。
我怎样才能做到这一点?
更新:
我刚试过:
instance.getattr(instance, fieldname).save(imagefile_name,
ContentFile(urllib2.urlopen(imgpath).read()))
我收到'MyModel' object has attribute 'getattr'
【问题讨论】:
-
请添加模型定义和完整的堆栈跟踪:)
-
@doniyor 是什么让你认为
getattr不是“正确的方式”? -
@doniyor 不,getattr 不 将模型作为参数。 getattr 接受一个对象并返回相关属性。它不关心对象是什么。在这种情况下,这正是正确的解决方案。
-
getattr将任何 python 对象作为第一个参数,在 Python 中,所有东西(至少,你可以绑定到名称的所有东西)都是一个对象。你把简单的事情过度复杂化了,真的。而getattr是一个内置函数,而不是一个方法。 -
不,为什么要这样?您是否在模型类上定义了一个名为
getattr的方法?
标签: python django django-models