2011-09-06 11 views
5

Verileri Django aracılığıyla bir PostgreSQL arka ucuna kaydediyorum. Modellerimdeki alanların birçoğu, DecimalFields'ın, veritabanı arka ucundaki sayısal sütunlara karşılık gelen, keyfi olarak yüksek maks_digitlere ve ondalık_sayılara ayarlanmış olmasıdır. Her sütundaki veriler, no'lu no'lu bir tanıma sahip olmayan bir hassaslığa (veya ondalık basamak sayısına) sahiptir ve belirli bir sütundaki her bir verimin aynı hassasiyete sahip olması gerekmez. tuşları veritabanı sütun isimleriDjango DecimalField ve PostgreSql Sayısal alanıyla çıktı hassaslığını koruma

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

:

Örneğin, bir modele argümanlar gibi görünebilir.

çıkışı üzerine, ben korumak ve onlar okunmuştur hangi hassasiyetle bu verileri yeniden görüntülemek gerekir. Diğer bir deyişle, veritabanı sorgulanır sonra, görüntülenen veriler okunmuştur ki verileri gibi tam olarak bakmak gerekir ondalıklarda hiçbir ek veya eksik iz 0 ile birlikte. Ancak, bir django kabuğunda veya yönetici arabiriminde sorgulandığında, tüm DecimalField verileri çok sayıda 0'la birlikte gelir.

Ben hassas (2 ondalık basamak) hem bilinen ve belirli bir sütundaki tüm veriler için aynıdır para değerleri için cevap benzer sorular gördük. Bununla birlikte, doğruluk aynı değilse ve önceden bilinmediğinde, Django'daki Ondalık değerler ve PostgreSQL'deki sayısal değerler tarafından temsil edilen kesin kesinliği nasıl en iyi şekilde koruyabiliriz?

DÜZENLEME:

bilgilerin Muhtemelen ek yararlı parçası

: Veri dbshell bir Django kaydedilmiş olduğu tablo görüntüleme, bir çok arka 0 en da vardır. Python Ondalık değeri, PostgreSQL arka ucuna kaydedildikten sonra, models.py dosyasında belirtilen maksimum hassasiyet değerine dönüştürülür.

+0

Django numaralarınızı karıştırıyorsa, muhtemelen DecimalField alt sınıfından veya tamamen sıfırdan başlayarak özel bir ModelField yazmanız gerekecektir: -/ – Dave

+0

Evet. Ne yazık ki, bu sorunun kısa cevabı, Django'nun (henüz) belirsiz kesinlikteki PostgreSQL sayısal sütununu desteklemediği şeklindedir. Bunun için bir kaç iş aklım var, ve bunu formüle etmek için zamanım olduğu anda, onlara yorum/öneri için başka bir soru soracağım. – krosbonz

cevap

1

mükemmel eşlik ileriye gerekiyorsa ve geriye, bir Charfield kullanmanız gerekir. Herhangi bir sayı tabanlı veritabanı alanı, verilerinizle bir şekilde veya başka bir şekilde etkileşime girecek. Şimdi, veri noktalarının rakam uzunluğunu bilmemeyi belirttiğinizi biliyorum ve bir CharField biraz uzunluğa ihtiyaç duyuyor. Ya isteğe bağlı olarak yüksek (1000, 2000, vb.) Ayarlayabilirsiniz ya da bir TextField kullanabilirsiniz.

Ancak, her iki yaklaşımla, çoğu senaryolarda çok veritabanı kaynaklarını israf olacağız. Yaklaşımınızı, sonuçta fazladan sıfırın önemli olmayacak şekilde değiştirmenizi öneririm (görüntüleme amacıyla her zaman onları kesebilirdiniz) veya hassaslığın daha uzun olmaması gibi. Ben bir süre önce bu soru soruldu ve cevap aynı kalır yana

1

, ben benzer bir pozisyonda herkese yararlı olması gerektiğini ne buldum paylaşacağız. Django, keyfi bir hassasiyetle PostgreSQL Sayısal kolon tipinden faydalanamaz. Veri tabanımın veri kesinliğini korumak için veri tabanım üzerine yüklerim ve python dizeleri içine ilk defa dizeleri tekrar girmeden veritabanı sorgularından elde edilen değerler üzerinde matematiksel hesaplamalar yapabilmek için, her biri için fazladan bir hassas sütun eklemeyi tercih ettim. Veritabanındaki sayısal sütun.

Kesinlik değeri, ondalık basamaktan sonra kaç basamak gerektiğini gösteren bir tamsayıdır. Referans noktası 4.350, ilgili hassas sütununda 3 değeri olarak atanır. Normal olarak görüntülenen tamsayılar (ör. 2531), 0'un hassas bir girişine sahiptir. Bununla birlikte, bilimsel gösterimde rapor edilen büyük tam sayılara, ekran hassasiyetlerini korumak için negatif bir tamsayı atanır.Örneğin, 4.320E+33 değeri, -3 hassas girişini alır. Veritabanı, negatif hassas değerlere sahip tüm nesnelerin bilimsel gösterimde yeniden gösterilmesi gerektiğini kabul eder.

Bu çözüm, yapıya ve veritabanını çevreleyen kodlara biraz karmaşıklık katar, ancak etkili olduğu kanıtlanmıştır. Ayrıca, log/log ve lineer değerlere dönüştürme gibi hesaplamalarla hassasiyeti doğru şekilde korumamı sağlar.

İlgili konular