AttributeError:'list'对象没有'objects'属性
我正在尝试运行以下代码,但出现了一个错误:
AttributeError: 'list'对象没有'objects'这个属性
script.py
#Get Dota2 Item Rarities
dotaItemRarityUrl = 'http://api.steampowered.com/IEconDOTA2_570/GetRarities/v1?'
dotaItemRarityPayload = {'key': settings.SOCIAL_AUTH_STEAM_API_KEY,
'language': 'en',
}
dotaItemRarityInfo = requests.get(dotaItemRarityUrl, params=dotaItemRarityPayload)
dotaItemRarity = dotaItemRarityInfo.json()
dotaItemRarity = dotaItemRarity['result']['rarities']
print(dotaItemRarity)
#print(dotaItemQualities)
#Populate Database With Item Rarities that do NOT exist already
for rarity in dotaItemRarity:
print rarity
irarityId = rarity['id']
irarityProperName = rarity['localized_name']
irarityInternalName = rarity['name']
irarityColor = rarity['color']
q = dotaItemRarity.objects.filter(rarityId=irarityId)
print q
if len(q) == 0:
newRarity = dotaItemRarity(rarityId=irarityId,
rarityProperName=irarityProperName,
rarityInternalName=irarityInternalName,
rarityColor=irarityColor)
newRarity.save()
models.py
class dotaItemRarity(models.Model):
rarityId = models.IntegerField(max_length=3,primary_key=True)
rarityProperName = models.CharField(max_length=60)
rarityInternalName = models.CharField(max_length=50)
rarityColor = models.CharField(max_length=30)
def __unicode__(self):
return self.rarityInternalName
我正在使用south来处理数据库的迁移,并且尝试了多种方法来解决这个问题,比如删除表格然后重新创建它们。根据我的理解,这个应该可以正常工作,有谁能给我一些正确的方向吗?
1 个回答
1
dotaItemRarity
是一个列表,它没有 objects
这个属性:
q = dotaItemRarity.objects.filter(rarityId=irarityId)
这是因为你把它绑定到了你从 JSON 结果中得到的一个列表上:
dotaItemRarity = dotaItemRarityInfo.json()
dotaItemRarity = dotaItemRarity['result']['rarities']
它不是你想象中的 Django 模型。
如果你在 script.py
中导入了 dotaItemRarity
这个 Django 模型,那么这个名字就不再指向那个模型了,因为你用列表替换掉了它。
你应该把这个列表改个名字,避免和模型的名字冲突。
注意,Python 风格指南 建议你使用 CamelCase(大驼峰命名法)来命名类(包括 Django 模型),这样可以避免类似的错误。
按照 PEP 8 的建议稍微重构一下你的代码,并使用更清晰的命名和实践:
models.py
:
class DotaItemRarity(models.Model):
rarity_id = models.IntegerField(max_length=3, primary_key=True)
rarity_proper_name = models.CharField(max_length=60)
rarity_internal_name = models.CharField(max_length=50)
rarity_color = models.CharField(max_length=30)
def __unicode__(self):
return self.rarity_internal_name
script.py
:
#Get Dota2 Item Rarities
url = 'http://api.steampowered.com/IEconDOTA2_570/GetRarities/v1'
payload = {'key': settings.SOCIAL_AUTH_STEAM_API_KEY, 'language': 'en'}
response = requests.get(url, params=payload)
rarities = response.json()['result']['rarities']
for rarity in rarities:
rarity_id = rarity['id']
try:
DotaItemRarity.get(rarity_id=rarity_id)
except DotaItemRarity.DoesNotExist:
new_rarity = DotaItemRarity(
rarityId=rarity_id,
rarity_proper_name=rarity['localized_name'],
rarity_internal_name=rarity['name'],
rarity_color=rarity['color'])
new_rarity.save()