我试图迭代一些json并将密钥添加到数据库中。我有一个返回字符串的函数。当我将该字符串分配给变量时,该变量将打印一个unicode字符串。为什么呢?
json_obj = json.loads(data)
for resource in json_obj:
# returns a string
san_resource = self.sanitize_resource(resource)
fresource = FertilityResource.objects.get_or_create(
title = san_resource['Resource Name'],
)
print(fresource[0].title, san_resource['Resource Name'])
def sanitize_resource(self, *args):
''' return resource values as string or blank string '''
resource = {}
for key, value in args[0].iteritems():
resource[key] = str(value).strip() if value != 'None' else ''
return resource
所以我将san_resource['Resource Name']
分配给fresource[0].title
字符串,当我打印它时,它有时 unicode。上述print语句的示例输出:
('Atrium Family YMCA', 'Atrium Family YMCA')
('Auburn Valley YMCA', 'Auburn Valley YMCA')
(u'Shop Well With You', 'Shop Well With You')
(u'Look Good Feel Better', 'Look Good Feel Better')
('Abba Wig Salon', 'Abba Wig Salon')
如您所见,san_resource['Resource Name']
始终是一个字符串,fresource[0].title
是一个字符串,但有时是unicode。为什么是这样?我该如何解决?
答案 0 :(得分:1)
当我将该字符串分配给变量时,该变量会输出一个unicode字符串
将该字符串传递给函数get_or_create()
:
fresource = FertilityResource.objects.get_or_create(
title = san_resource['Resource Name'],
)
如果数据库中存在FertilityResource
且主键与此匹配(可能是title
),则会从数据库返回现有的FertilityResource
。在这种情况下,title
将是一个Unicode字符串,因为所有Django ORM CharField
属性都是本地unicode
。
另一方面,如果你没有db中的现有实例,Django会创建一个具有你给它的确切值的新实例。在将实例放入数据库后,它不会从数据库中取回实例,因此您可以使用未触及的str
。
resource[key] = str(value).strip() if value != 'None' else ''
这是为了什么?对于value
中的非ASCII字符,它将失败。您应该尝试将所有字符串保留为unicode
形式,这是使用文本的常规方式,以及JSON字符串和Django字符字段的本机类型。也许你想要这样的东西:
# Convert non-string types to strings
if not isinstance(value, basestring):
value = unicode(value, 'utf-8', 'replace')
# Ignore special null value
if value == u'None':
value = u''
resource[key] = value.strip()