解決:AttributeError: can't set attribute

報錯代碼如下:

File "./ga_web/lib/meta_data.py", line 94, in instance_list_ip_port
    return [x.get('ip')+':'+str(x.get('port')) for x in self.instance_list(filter)]
  File "./ga_web/lib/meta_data.py", line 82, in instance_list
    for d in instance_list:
  File "/usr/local/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/db/models/query.py", line 1312, in __iter__
    setattr(instance, column, values[pos])
AttributeError: can't set attribute

可以看到出錯地方是在 迭代instance_list 對象的時候報錯的。

sql = "select i.* ,i.business_id,b.name as business,i.owner as owner_id,u.name as owner from instance i " \
              "left join business b on i.business_id=b.id left join user u on i.owner=u.id where 1=1 "
return Instance.objects.raw(sql)

而model Instance 有一個屬性是“business”,sql語句的返回結果裏也有個“business”字段,兩個字段同名,導致數據從數據庫查出來後,映射到model上正對上這個名稱,所以instance_list(集合)中對象的“business”屬性無法賦值或設置。解決辦法是:要麼重命名Instance中的“business”,要麼修改sql語句中的“business”爲其他名稱,都可以解決。

這個報錯其實很大衆,可能大家出錯的地方都不同,但最終根源問題還都是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章