2011-09-06 16 views
5

Tôi đang lưu dữ liệu vào chương trình phụ trợ PostgreSQL thông qua Django. Nhiều trường trong các mô hình của tôi là DecimalFields được đặt thành max_digits và decimal_places tùy ý, tương ứng với các cột số trong phần cuối của cơ sở dữ liệu. Dữ liệu trong mỗi cột có độ chính xác (hoặc số chữ số thập phân) không được biết là một số trước là và mỗi mốc trong một cột nhất định không cần có cùng độ chính xác.Bảo toàn độ chính xác đầu ra với Django DecimalField và trường số PostgreSql

Ví dụ, đối số cho một mô hình có thể trông giống như:

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

nơi các phím là tên cột cơ sở dữ liệu.

Khi xuất, tôi cần giữ lại và hiển thị lại dữ liệu đó với độ chính xác mà chúng được đọc. Nói cách khác, sau khi cơ sở dữ liệu được truy vấn, dữ liệu được hiển thị cần phải chính xác giống như dữ liệu đã được đọc , không có dấu 0 bổ sung hoặc bị thiếu trong số thập phân. Khi truy vấn, tuy nhiên, hoặc trong một vỏ django hoặc trong giao diện quản trị, tất cả các dữ liệu DecimalField trở lại với nhiều dấu 0.

Tôi đã thấy các câu hỏi tương tự được trả lời cho các giá trị tiền, trong đó độ chính xác (2 chữ số thập phân) được biết và giống nhau cho tất cả dữ liệu trong một cột nhất định. Tuy nhiên, làm thế nào tốt nhất có thể duy trì độ chính xác chính xác được biểu diễn bằng giá trị thập phân trong giá trị Django và số trong PostgreSQL khi độ chính xác không giống nhau và không được biết trước?

EDIT:

Có thể một mảnh bổ sung hữu ích của thông tin: Khi xem bảng mà dữ liệu được lưu trong một Django dbshell, nhiều trailing 0 cũng có mặt. Giá trị thập phân python dường như được chuyển đổi thành giá trị chính xác tối đa được chỉ định trong tệp models.py khi được lưu vào phần phụ trợ PostgreSQL.

+0

Nếu django đang trộn các số của bạn, có thể bạn sẽ cần phải viết một ModelField tùy chỉnh, hoặc từ phân lớp DecimalField hoặc hoàn toàn bắt đầu từ đầu: -/ – Dave

+0

Có. Thật không may, câu trả lời ngắn cho câu hỏi này dường như là Django không (chưa) hỗ trợ cột số PostgreSQL của độ chính xác không xác định. Tôi có một vài công việc trong tâm trí cho điều này, và ngay sau khi tôi có thời gian để xây dựng nó, tôi sẽ hỏi một câu hỏi khác cho ý kiến ​​/ đề xuất về họ. – krosbonz

Trả lời

1

Nếu bạn cần độ ngang hoàn hảo về phía trước và phía sau, bạn sẽ cần sử dụng CharField. Bất kỳ trường cơ sở dữ liệu dựa trên số nào sẽ tương tác với dữ liệu của bạn chuyển đổi dữ liệu theo cách này hay cách khác. Bây giờ, tôi biết bạn đã đề cập không thể biết được chiều dài chữ số của các điểm dữ liệu, và một CharField đòi hỏi một số chiều dài. Bạn có thể thiết lập nó tùy ý cao (1000, 2000, vv) hoặc tôi giả sử bạn có thể sử dụng TextField, thay vào đó.

Tuy nhiên, với một trong hai cách tiếp cận, bạn sẽ lãng phí rất nhiều tài nguyên cơ sở dữ liệu trong hầu hết các trường hợp. Tôi sẽ đề nghị sửa đổi cách tiếp cận của bạn sao cho số không phụ ở cuối không quan trọng (vì mục đích hiển thị bạn luôn có thể cắt chúng), hoặc sao cho độ chính xác không còn tùy ý nữa.

1

Vì tôi đã hỏi câu hỏi này một lúc trước và câu trả lời vẫn giữ nguyên, tôi sẽ chia sẻ những gì tôi thấy nếu nó hữu ích cho bất kỳ ai ở một vị trí tương tự. Django không có khả năng tận dụng lợi thế của loại cột số PostgreSQL với độ chính xác tùy ý. Để duy trì độ chính xác của dữ liệu tôi tải lên cơ sở dữ liệu của mình và để có thể thực hiện các phép tính toán học về các giá trị thu được từ truy vấn cơ sở dữ liệu mà không phải tính lại chuỗi thành các loại thập phân python, tôi đã chọn thêm cột chính xác bổ sung cho mọi cột số trong cơ sở dữ liệu.

Giá trị chính xác là số nguyên cho biết có bao nhiêu chữ số sau dấu thập phân được yêu cầu. Datum 4.350 được gán giá trị 3 trong cột chính xác tương ứng. Các số nguyên được hiển thị thông thường (ví dụ: 2531) có mục nhập chính xác là 0. Tuy nhiên, các số nguyên lớn được báo cáo trong ký hiệu khoa học được gán một số nguyên âm để duy trì độ chính xác hiển thị của chúng.Ví dụ: giá trị 4.320E+33, nhận mục nhập chính xác -3. Cơ sở dữ liệu nhận ra rằng tất cả các đối tượng có giá trị độ chính xác âm sẽ được hiển thị lại trong ký pháp khoa học.

Giải pháp này thêm một số phức tạp vào cấu trúc và mã xung quanh cơ sở dữ liệu, nhưng nó đã được chứng minh là có hiệu quả. Nó cũng cho phép tôi bảo toàn chính xác độ chính xác thông qua các tính toán như chuyển đổi sang/từ các giá trị log và tuyến tính.

Các vấn đề liên quan