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

2024-07-05 15:05:21 发布

您现在位置:Python中文网/ 问答频道 /正文

当检查是否存在具有特定值的键时,我得到一个类型错误:字符串索引必须是整数

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

这是用户punchcard的数据库

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,并且没有任何一个表可以一直用于检查它。所以代码中的else正在运行,而不是if。另外,当用户打卡时,这是为请求运行的代码

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

我确信我查对了


Tags: nameinnonedateiftitlemodelsstatus
1条回答
网友
1楼 · 发布于 2024-07-05 15:05:21

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

PunchCard模型将CharField作为clock,这意味着字符串存储在该字段中。因此,userPunchCard.clock将返回一个字符串。如果你在这个字符串上迭代,你就在字符上迭代,这些字符也是字符串。所以在这种情况下dObj是一个字符串,因此dObj["date"]确实会引发一个错误

您可能希望使用^{} field [Django-doc],正如^{} 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)

相关问题 更多 >