TypeError:使用字典检查数组时,字符串索引必须为整数

时间:2019-07-14 19:48:50

标签: python arrays django dictionary

当检查是否存在具有特定值的键时,出现类型错误:字符串索引必须为整数。

if not any(dObj["date"] == wholeDay for dObj in userPunchCard.clock):
  status = "Clock In"
  content = {
    "name" : user.name,
    "title" : user.title,
    "status" : status
  }

这是userPunchCard的数据库

class StaffMember(models.Models):
  name = models.CharField(max_length = 255)
  title = models.CharField(max_length = 255)
  email = models.ChardField(max_length = 255)
  password = models.ChardField(max_length = 255)
  created_at = models.DateTimeField(auto_now_add = True)
  updated_at = models.DateTimeField(auto_now = True)
  objects = UserManager()
class PunchCard(models.Model):
  clock = models.CharField(max_length = 9999)
  employee = models.ForeignKey(StaffMember, on_delete=models.PROTECT)

由于此代码,我很肯定userPunchCard.clock实际上是一个至少存在一个字典的数组。

if userPunchCard.clock is None:
 print ("if was hit in dashboard")

else:
 if not any(dObj["date"] == wholeDay for dObj in userPunchCard.clock:
status = "Clock In"
content = {
  "name" : user.name,
  "title" : user.title,
  "status" : status
}

在创建Django db表时,该表在为空时将为null,None一直在为我服务。因此,此代码中的else正在运行,而不是if。另外,当用户登录时,这就是为请求运行的代码。

userPunchCard.clock = []
newClockIn = {
  "date" : wholeDay,
  "clockIn" : standardTime,
  "clockOut" : None,
  "timeSpent" : None,
  "points" : None,
  "desc: None
}
userPunchCard.clock.append(newClockIn)
userPunchCard.save()

我确定自己检查正确。

1 个答案:

答案 0 :(得分:1)

简短答案:您可能希望将clock设为JSONField

PunchCard模型的CharFieldclock类似,因此意味着字符串存储在该字段中。结果,您的userPunchCard.clock将返回一个字符串。如果然后遍历该字符串,则遍历字符,也就是字符串。因此,在那种情况下,dObj是一个字符串,因此dObj["date"]确实会引发错误。

您可能想使用JSONField field [Django-doc]所提供的django-jsonfield package [PyPi]。在大多数数据库中(例如PostgreSQL除外),它仍然在内部存储为CharField,但是Django会自动将对象编码和解码为JSON对应对象。因此JSONField可以存储列表,字典,字符串,整数等。

例如:

from jsonfield import JSONField

class PunchCard(models.Model):
    clock = JsonField(default=list)
    employee = models.ForeignKey(StaffMember, on_delete=models.PROTECT)