Где пользовательские поля модели преобразуются в их db_type?
Я немного запутался здесь.
Я написал настраиваемое поле модели под названием 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)