2011-06-06 54 views
5

我一直試圖在Django模型的字段中存儲整數數組。基於this reply,我一直試圖使用CommaSeparatedIntegerField來實現,但是這已經證明不如名稱暗示的直覺。用Django存儲整數數組

如果我有一個逗號分隔的整數列表(list = [12,23,31]),我將它存儲在一個CommaSeparatedIntegerField中,它會返回字符串(retrieved_list outputs u'[1,2,3]')。我不能簡單地檢索我的整數:例如,int(retrieved_list[1])輸出1,而list[1]將輸出23.

所以,我必須手動解析還是有其他解決方案嗎?而且,CommaSeparatedIntegerField與CharField有什麼不同?在我看來,他們的行爲幾乎相同......

回答

6

此字段類型與CharField唯一的區別在於它驗證數據格式正確 - 只有數字以','分隔。您可以在http://docs.nullpobug.com/django/trunk/django.db.models.fields-pysrc.html#CommaSeparatedIntegerField查看課程的源代碼(展開'+')。

通過使用eval,您可以將這樣的字符串轉換爲實際的Python列表值(不是array - list是Python的合適術語)。

>>> eval("[1,2,3,4]") 
[1, 2, 3, 4] 

編輯:EVAL有安全問題,但和更好的方法是使用literal_eval作爲另一個答案建議由阿爾文。

+0

好, 感謝你的回答! :) – storm 2011-06-06 06:11:12

+4

evallll>:E ~~~~ – 2011-06-06 08:03:53

+0

不能相信這甚至沒有一個upvote。這是一個! :-) – 2012-03-26 02:49:00

10

評估和演示被接納爲回答上述 - 避免它只是沒有安全的誘惑

參見:Python: make eval safe

有可能被使用的相同方式literal_eval功能:

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