Хранение массива целых чисел с Django - PullRequest
5 голосов
/ 06 июня 2011

Я пытался сохранить массив целых чисел в поле модели 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 голосов
/ 14 января 2014

Eval был принят как ответ выше - избегайте соблазна, это просто не безопасно

См .: Python: сделать eval безопасным

Существует функция literal_eval , которую можно использовать таким же образом:

>>> from ast import literal_eval
>>> literal_eval("[1,2,3,4]")
[1, 2, 3, 4]
5 голосов
/ 06 июня 2011

Единственная разница между этим типом поля и CharField заключается в том, что он проверяет, что данные имеют правильный формат - только цифры, разделенные ','.Вы можете просмотреть исходный код для класса в http://docs.nullpobug.com/django/trunk/django.db.models.fields-pysrc.html#CommaSeparatedIntegerField (разверните '+').

Вы можете превратить такую ​​строку в фактическое значение списка Python (не массив - список - правильный терминдля Python) с использованием eval.

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

EDIT: eval имеет проблемы с безопасностью, однако, и лучший способ - использовать literal_eval, как это предложил Элвин в другом ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...