Джанго: Модель поля для хранения списка поплавков? - PullRequest
4 голосов
/ 03 августа 2010

Я хочу сохранить список плавающих переменных в Django.Есть CommaSeparatedIntegerField, но есть ли что-нибудь подобное, что я мог бы использовать?Было бы лучше просто реализовать свой собственный CommaSeparetedFloatField или есть что-то, что я пропускаю полностью?Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 августа 2010

Я думаю, вы можете довольно легко определить собственное поле:

comma_separated_float_list_re = re.compile('^([-+]?\d*\.?\d+[,\s]*)+$')
validate_comma_separated_float_list = RegexValidator(
              comma_separated_float_list_re, 
              _(u'Enter only floats separated by commas.'), 'invalid')

class CommaSeparatedFloatField(CharField):
    default_validators = [validators.validate_comma_separated_float_list]
    description = _("Comma-separated floats")

    def formfield(self, **kwargs):
        defaults = {
            'error_messages': {
                'invalid': _(u'Enter only floats separated by commas.'),
            }
        }
        defaults.update(kwargs)
        return super(CommaSeparatedFloatField, self).formfield(**defaults)

Этот фрагмент не является тестом, но, возможно, вы сможете адаптировать его для своих нужд.

0 голосов
/ 27 февраля 2014

Это немного зависит от вашего варианта использования.Если вы получаете список с плавающей точкой в ​​виде строки и вам никогда не нужны сами значения, подклассы CharField являются разумными.Тем не менее, это не особенно экономит место, и вам нужно выполнить преобразование, если вы хотите что-то сделать с числами, отличными от их отображения.

Если у вас длинные списки с плавающей точкой, часто нужно искать, использовать,или измените их значения, и пытаясь сэкономить место в БД, вы можете рассмотреть либо использование PickledObjectField , либо запись чисел с плавающей точкой в ​​двоичную строку (например, запись в двоичный файл), а также сохранение этой двоичной строки с помощью BinaryField .

PickledObjectField является излишним, но если вы можете изменить структуру этого объекта позже или добавить вещи, которые не являются плавающими, это, вероятно, путь.

BinaryField - это тот, который хранит числа в форме, наиболее близкой к их необработанным / внутренним формам.Это означает, что у него должно быть самое компактное хранилище, самые быстрые поиски и преобразования, и наименьшее количество ошибок при округлении или преобразовании.Пакет struct предоставляет функции для преобразования в двоичные строки и из них.

...