Django模型与PostgreSQL货币类型

2 投票
2 回答
1932 浏览
提问于 2025-04-17 09:57

我有一个现成的PostgreSQL数据库,正在用它来搭建一个新的Django网站。当我运行:

python manage.py inspectdb

时,发现有几个字段的类型是PostgreSQL的“money”,但是转换得不太对。值得一提的是,Django至少会告诉你它们是在猜测。:)

在PostgreSQL的文档中,他们提供了关于money类型的以下信息:

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

我觉得在Django中,这个应该用DecimalField来表示。

其他人是怎么处理这个问题的呢?如果你之前遇到过这个问题,有没有发现什么“注意事项”?有没有什么我需要知道的事情等等?

版本信息:

PostgreSQL 9.1,Python 2.6.5 和 Django 1.3.1

2 个回答

1

因为Money类型的输出会受到地区的影响,而你可能想把它当作普通数字来使用并在应用中格式化,所以我建议你不要使用Money类型。可以用普通的Decimal类型来代替。

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)

撰写回答