2014-07-22 62 views
-1

我试图运行它抛出AttributeError的: '名单' 对象有没有属性 '对象'

AttributeError: 'list' object has no attribute '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 

我正在使用sout h来处理迁移,并尝试了多种方法来解决这个问题。删除表格并重建它们。据我所知,这应该工作,任何人都可以指向正确的方向。

+0

你定义一个名为列表'dotaItemRarity',它会以相同的名称遮盖您导入的模型。重命名你的清单。 – Blender

回答

1

dotaItemRarity是一个列表,它没有objects属性:

q = dotaItemRarity.objects.filter(rarityId=irarityId) 

那是因为你从你的JSON结果绑定了一个清单:

dotaItemRarity = dotaItemRarityInfo.json() 
dotaItemRarity = dotaItemRarity['result']['rarities'] 

这是一个Django模型,就像你期望的那样。

如果您将dotaItemRarity Django模型导入到script.py中,则名称不再绑定到该模型,因为您已将其替换为该列表。

将列表重命名为使用不掩盖模型的其他名称。

请注意,Python style guide建议您为类(包括Django模型)使用CamelCase名称,以避免此类错误。

继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() 
+0

哇......非常感谢。我的这个愚蠢的错误,但感谢指导我在最佳实践方面的正确方向。这应该有助于避免这种情况再次发生。 – Deep

相关问题