2012-01-10 64 views
2

我有一個現有的PostgreSQL數據庫,我正在使用一個新的Django站點。當我運行時:Django模型和PostgreSQL資金類型

python manage.py inspectdb 

我得到幾個有PostgreSQL類型的「金錢」,不能正確轉換的字段。對Django來說,他們至少告訴你他們在猜測。 :)

在PostgreSQL文檔,它們提供了資金類型的以下信息:

Name: money 
Storage Size: 8 bytes 
Description: currency amount  
Range: -92233720368547758.08 to +92233720368547758.07 

好像對我來說,這應該是在Django一個DecimalField。

其他人怎麼處理這個?如果你之前遇到過這個問題,你是否發現任何「陷阱」?任何我應該知道的事情等等?

版本信息:

的PostgreSQL 9.1與Python 2.6.5和1.3.1的Django

回答

2

這是我爲這個問題所做的。我從CharField中定義了一個自定義字段,然後添加了一個自定義驗證器。注意:我遇到了DecimalField在管理模塊中正確驗證的問題(我想你可以稱之爲我所問的「陷阱」之一!)。我已經爲代碼創建了單元測試,並通過管理頁面進行了測試,似乎工作正常。

from django.db import models 
from django.core import exceptions 
import re 


MONEY_REGEX_PATTERN = re.compile('^\$?-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$') 

def MoneyValidator(value): 
    """Will validate a string value against a money regular expression""" 
    if not MONEY_REGEX_PATTERN.match(value): 
     raise exceptions.ValidationError('{v} is not a valid dollar amount'.format(v=value)) 


class MyMoneyField(models.CharField): 

    """Custom field for handling values from PostgreSQL's money data type""" 

    def __init__(self, *args, **kwargs): 
     kwargs['validators'] = [MoneyValidator] 
     kwargs['max_length'] = 20 
     super(MyMoneyField, self).__init__(*args, **kwargs) 
1

有錢類型的輸出是一個本地敏感,我想你想使用它作爲正常的數量和格式它在應用程序中,我寧願說你不應該使用金錢。使用正常的十進制代替。

+1

+1爲了避免錢款 – 2012-01-11 16:39:38

+0

嗯......感謝您的評論。但是,它不回答問題或解決我的問題。注意:我說這是一個現有的數據庫。 – 2012-01-11 17:06:32