使用Django存储整数数组
我一直在尝试把一组整数存储到Django模型的一个字段里。根据这个回答,我试着用一个叫做CommaSeparatedIntegerField的字段来实现,但这比我想象的要复杂。
比如说,我有一个用逗号分隔的整数列表(list = [12,23,31])
,当我把它存储到CommaSeparatedIntegerField里时,取出来的结果变成了一个字符串(retrieved_list outputs u'[1,2,3]')
。我不能直接拿到我的整数:比如说,int(retrieved_list[1])
的结果是1,而list[1]
的结果应该是23。
所以,我是不是得手动解析这些数据,还是说有其他的解决办法?而且,CommaSeparatedIntegerField和CharField到底有什么区别呢?我觉得它们的表现差不多……
2 个回答
上面提到的使用 eval 被认为是一个可行的答案,但最好不要去尝试,因为这样做不安全。
可以参考这个链接: Python: 让 eval 更安全
还有一个 literal_eval 函数,可以用来做类似的事情:
>>> from ast import literal_eval
>>> literal_eval("[1,2,3,4]")
[1, 2, 3, 4]
这个字段类型和CharField的唯一区别在于,它会检查数据格式是否正确——也就是说,数据只能是用逗号分隔的数字。你可以在这个链接查看这个类的源代码:http://docs.nullpobug.com/django/trunk/django.db.models.fields-pysrc.html#CommaSeparatedIntegerField(点击'+'展开内容)。
你可以通过使用eval将这样的字符串转换成Python中的一个实际列表(注意,Python中称之为列表,而不是数组)。
>>> eval("[1,2,3,4]")
[1, 2, 3, 4]
编辑:不过,使用eval有安全隐患,建议使用literal_eval,这个方法更安全,Alvin在另一个回答中提到过。