Django模型和PostgreSQL钱类型

时间:2012-01-10 23:08:31

标签: python django postgresql django-models

我有一个现有的PostgreSQL数据库,我正用于新的Django网站。我跑的时候:

python manage.py inspectdb

我得到了几个具有PostgreSQL类型“money”但无法正确转换的字段。对于Django来说,他们至少会告诉你他们在猜测。 :)

在PostgreSQL文档中,它们提供了有关货币类型的以下信息:

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

在我看来,这应该是Django中的DecimalField。

其他人如何处理此问题?如果你之前遇到过这个问题,你有没有发现任何“陷阱”?我应该注意什么,等等?

版本信息:

PostgreSQL 9.1 with Python 2.6.5和Django 1.3.1

2 个答案:

答案 0 :(得分: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)

由于Money类型的输出是区域敏感的,我认为你想将它作为普通数字使用并在应用程序中对其进行格式化,我宁愿说你不应该使用Money。请改用正常的十进制。