Модели Django и денежный тип PostgreSQL - PullRequest
2 голосов
/ 11 января 2012

У меня есть существующая база данных PostgreSQL, которую я использую для нового сайта Django.Когда я запускаю:

python manage.py inspectdb

, я получаю несколько полей с типом PostgreSQL «деньги», которые не конвертируются правильно.К чести Джанго, они по крайней мере говорят вам, что они гадают.:)

В документации PostgreSQL они предоставляют следующую информацию для типа денег:

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

Мне кажется, что это должен быть DecimalField в Django.

Как другие люди справились с этим?И если вы сталкивались с этой проблемой раньше, вы обнаружили какие-либо "ошибки"?Что-нибудь, о чем я должен знать, и т.д.?

Информация о версии:

PostgreSQL 9.1 с Python 2.6.5 и Django 1.3.1

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Вот что я сделал для этой проблемы.Я определил настраиваемое поле подклассом из 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 голос
/ 11 января 2012

Поскольку выходные данные типа Money чувствительны к локали, и я думаю, что вы хотите использовать его как обычное число и отформатировать его в приложении, я бы сказал, что вы не должны использовать MoneyВместо этого используйте обычный десятичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...