当检查是否存在具有特定值的键时,出现类型错误:字符串索引必须为整数。
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()
我确定自己检查正确。
答案 0 :(得分:1)
简短答案:您可能希望将clock
设为JSONField
。
PunchCard
模型的CharField
与clock
类似,因此意味着字符串存储在该字段中。结果,您的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)