【问题标题】:django - save instance - attribute as a variable - not working [duplicate]django - 保存实例 - 属性作为变量 - 不起作用[重复]
【发布时间】: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


【解决方案1】:

未经测试的代码,但它会告诉你如何使用getattr

def save_image_to_model(instance, **kwargs):
   fieldname = kwargs.pop('fieldname')
   imgpath = kwargs.pop('imgpath')
   imagefile_name = urlparse(imgpath).path.split('/')[-1]
   data = urllib2.urlopen(imgpath).read()
   field = getattr(instance, fieldname)
   field.save(imagefile_name, ContentFile(data))
   instance.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2018-07-05
    • 2015-02-27
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多