Где пользовательские поля модели преобразуются в их db_type? - PullRequest
0 голосов
/ 22 февраля 2019

Я немного запутался.

Я написал поле пользовательской модели с именем PriceField, которое возвращает экземпляр моего класса Price из его методов from_db_value и to_python, которые обапреобразовать из строк в экземпляры Price.

Мой метод db_type возвращает "string", потому что я хочу, чтобы значения поля были представлены в виде строк в базе данных.

Когда я идучтобы добавить модель, содержащую PriceField в базу данных, я получаю InterfaceError: binding parameter 3.Значение params для оператора sql равно

[1,
 'test',
 'desc',
 <utils.Price object at 0x7f159d9e6da0>,
 '2019-02-22 00:39:31.634898',
 'FS',
 True,
 True,
 True,
 True,
 True,
 '',
 '']

Я вполне уверен, что <utils.Price object at 0x7f159d9e6da0> - это моя проблема - как мне преобразовать это в строку, чтобы база данных могла принять ее?У меня уже есть __str__ методы для моих Price и PriceField классов.

Вот мои 2 класса:

class Price():
    units = None
    value = 0

    def __init__(self, units, value):
        if not type(units) is PaymentUnit:
            # TODO: Throw the right exception here
            return;

        self.units = units;
        self.value = value;


    def __str__(self):
        return self.units.symbol + str(self.value)



class PriceField(models.Field):
    units = '⧫'
    value = 1

    def __init__(self, value = 1, units='⧫', *args, **kwargs):         

         self.value = value;
         self.units = units;

        # Pass the values to the super class constructor

         # Up to 16 digits, plus a decimal and up to 8 decimal
         # digits (0.00000001 BTC is 1 satoshi)
         kwargs['max_length'] = 24;

         kwargs['help_text'] = 'Represents a price in a specific currency.';

         kwargs['default'] = '⧫1'

         super().__init__(*args, **kwargs)

    def deconstruct(self):
         name, path, args, kwargs = super().deconstruct()         
         del kwargs['max_length']

         if self.units != '⧫':
             kwargs['units'] = self.units

         if self.value != 1:
             kwargs['value'] = self.value

         return name, path, args, kwargs

    def db_type(self, connection):
        return 'string'

    def from_db_value(self, value, expression, connection):
        if value is None:
            return None
        return parse_price(value);


    def to_python(self, value):
        if isinstance(value, Price):
            return value
        elif value is None:
            return None
        else:
            return parse_price(value)

    def __str__(self):
        return "{0}{1}".format(self.units.symbol, self.value)
...