Сохранение точности вывода с помощью Django DecimalField и PostgreSql Numeric field - PullRequest
7 голосов
/ 06 сентября 2011

Я сохраняю данные в бэкэнд PostgreSQL через Django. Многие из полей в моих моделях имеют для DecimalFields произвольно высокие значения max_digits и decimal_places, соответствующие числовым столбцам в базе данных базы данных. Данные в каждом столбце имеют точность (или число десятичных разрядов), которая неизвестна a priori , и каждый элемент данных в данном столбце не обязательно должен иметь одинаковую точность.

Например, аргументы модели могут выглядеть так:

{'dist': Decimal("94.3"), 'dist_e': Decimal("1.2")}
{'dist': Decimal("117"), 'dist_e': Decimal("4")}

где ключи - это имена столбцов базы данных.

После вывода мне нужно сохранить и заново отобразить эти данные с точностью, с которой они были прочитаны. Другими словами, после запроса к базе данных отображаемые данные должны выглядеть точно так же, как данные, которые были прочитаны, без дополнительных или отсутствующих конечных 0 в десятичных разрядах. Однако при запросе в оболочке django или в интерфейсе администратора все данные DecimalField возвращаются со многими конечными нулями.

Я видел похожие вопросы, на которые даны ответы для денежных значений, где точность (2 десятичных знака) известна и одинакова для всех данных в данном столбце. Однако как лучше сохранить точную точность, представленную десятичными значениями в Django и числовыми значениями в PostgreSQL, если точность не одинакова и заранее не известна?

EDIT:

Возможно, дополнительная полезная информация: при просмотре таблицы, в которой сохраняются данные в dbango-оболочке Django, также присутствуют многочисленные конечные нули. Десятичное значение python, по-видимому, преобразуется в значение максимальной точности, указанное в файле models.py, после сохранения в серверной части PostgreSQL.

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Если вам нужен идеальный паритет вперед и назад, вам нужно использовать CharField. Любое поле базы данных на основе чисел так или иначе взаимодействует с вашими данными. Теперь я знаю, что вы упомянули, что не можете узнать длину цифр точек данных, и CharField требует некоторой длины. Вы можете установить его произвольно высоким (1000, 2000 и т. Д.) Или, я полагаю, вместо него можно использовать TextField.

Однако при любом из этих подходов вы будете тратить много ресурсов базы данных в большинстве сценариев. Я бы предложил изменить ваш подход так, чтобы дополнительные нули в конце не имели значения (для целей отображения вы всегда могли их отрубить), или чтобы точность больше не была произвольной.

1 голос
/ 09 февраля 2016

Так как я задал этот вопрос некоторое время назад, и ответ остался прежним, я поделюсь тем, что нашел, если это будет полезно для любого в подобной должности. У Django нет возможности использовать тип столбца PostgreSQL Numeric с произвольной точностью. Чтобы сохранить точность отображения данных, которые я загружаю в свою базу данных, и чтобы иметь возможность выполнять математические вычисления для значений, полученных из запросов к базе данных, без предварительного преобразования строк в десятичные типы Python, я решил добавить столбец дополнительной точности для каждого числовой столбец в базе данных.

Значение точности представляет собой целое число, указывающее, сколько цифр после десятичной запятой требуется. Элементу 4.350 присваивается значение 3 в соответствующем столбце точности. Обычно отображаемые целые числа (например, 2531) имеют точность ввода 0. Однако большим целым числам, указанным в научной записи, присваивается отрицательное целое число для сохранения точности отображения. Например, значение 4.320E+33 получает запись точности -3. База данных признает, что все объекты с отрицательными значениями точности должны быть повторно отображены в научной записи.

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

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