【问题标题】:Storing an array of integers with Django使用 Django 存储整数数组
【发布时间】:2011-09-09 01:07:07
【问题描述】:

我一直在尝试将整数数组存储在 Django 模型的字段中。基于this reply,我一直在尝试使用 CommaSeparatedIntegerField 来做到这一点,但是事实证明这并不像名称所暗示的那样直观。

如果我有一个以逗号分隔的整数列表(list = [12,23,31]),并将其存储在 CommaSeparatedIntegerField 中,它会以字符串(retrieved_list outputs u'[1,2,3]') 的形式返回。我不能简单地检索我的整数:例如,int(retrieved_list[1]) 输出 1 而list[1] 将输出 23。

那么,我必须手动进行解析,还是有其他解决方案? CommaSeparatedIntegerField 与 CharField 究竟有何不同?在我看来,他们的行为几乎相同......

【问题讨论】:

    标签: python django arrays integer


    【解决方案1】:

    此字段类型与 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 存在安全问题,但是,更好的方法是按照 Alvin 在另一个答案中的建议使用 literal_eval。

    【讨论】:

    • 不敢相信这甚至没有一个赞成票。这是一个! :-)
    • 你可以使用json.loads("[1,2,3,4]"),它也返回[1, 2, 3, 4]
    【解决方案2】:

    Eval 被接受为上面的答案——避免它不安全的诱惑

    见:Python: make eval safe

    有一个literal_eval 函数可以以同样的方式使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多