使用Django存储整数数组

5 投票
2 回答
6565 浏览
提问于 2025-04-16 19:00

我一直在尝试把一组整数存储到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 个回答

10

上面提到的使用 eval 被认为是一个可行的答案,但最好不要去尝试,因为这样做不安全。

可以参考这个链接: Python: 让 eval 更安全

还有一个 literal_eval 函数,可以用来做类似的事情:

>>> from ast import literal_eval
>>> literal_eval("[1,2,3,4]")
[1, 2, 3, 4]
5

这个字段类型和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在另一个回答中提到过。

撰写回答