AttributeError:'list'对象没有'objects'属性

-1 投票
1 回答
9444 浏览
提问于 2025-04-18 14:14

我正在尝试运行以下代码,但出现了一个错误:

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()

撰写回答