Сохранить вычисленное поле в Базу Django
Не могу сохранить значение вычисленного поля в базу данных. Есть 3 модели:
class ExchangeDirectionAdmin(admin.ModelAdmin):
list_display = ['curr_custom', 'type', 'commission', 'rate_custom', 'time_to_buy', 'available', 'new_rate', 'code_xml2']
list_editable = ['commission', 'available']
list_filter = ['available', 'crypto_curr', 'fiat_curr', 'type']
search_fields = ['crypto_curr__title', 'fiat_curr__title']
fieldsets = [
('Общая информация', {'fields': ['crypto_curr', 'fiat_curr', 'type']}),
('Параметры', {'fields': ['commission', 'time_to_buy', 'available']}),
]
list_per_page = 10
def curr_custom(self, obj):
return obj.crypto_curr.title + "/" + obj.fiat_curr.title
curr_custom.short_description = 'Направление'
def rate_custom(self, obj):
return str(convert(obj.crypto_curr.symbol, obj.fiat_curr.symbol, Decimal(1), 0, obj.commission, obj.type).result.__round__(obj.buy_curr.round))
rate_custom.short_description = 'Курс обмена'
def has_add_permission(self, *args, **kwargs):
return True
def has_change_permission(self, *args, **kwargs):
return True
def has_delete_permission(self, *args, **kwargs):
return True
def code_xml2(self, obj):
crypto_xml = obj.crypto_curr.symbol_xml_crypto
fiat_xml = obj.fiat_curr.symbol_xml_fiat
code_xml2 = "{}{}".format(crypto_xml, fiat_xml)
return code_xml2
code_xml2.short_description = 'КОД пары XML'
class ExchangeDirection(models.Model):
TYPES = ((ExchangeDirectionItems.BUY, '🟢 Покупка крипты за фиат'), (ExchangeDirectionItems.SELL, '🔴 Продажа крипты за фиат'))
TYPES_DICT = {}
for type in TYPES: TYPES_DICT[type[0]] = type[1]
crypto_curr = models.ForeignKey(CryptoCurrency, models.CASCADE, verbose_name="Криптовалюта")
fiat_curr = models.ForeignKey(FiatCurrency, models.CASCADE, verbose_name="Фиатная валюта")
type = models.CharField('Тип', max_length=4, choices=TYPES)
commission = models.DecimalField('Процент комиссии', default=1.0, decimal_places=2, max_digits=5)
time_to_buy = models.IntegerField('Время на оплату, с.', default=1200)
available = models.BooleanField('Доступна')
new_rate = models.FloatField(verbose_name='Курс с грамбита', default=0)
code_xml = models.CharField('Код XML', max_length=4024)
@property
def sell_curr(self):
return self.crypto_curr if self.type == ExchangeDirectionItems.SELL else self.fiat_curr
@property
def buy_curr(self):
return self.crypto_curr if self.type == ExchangeDirectionItems.BUY else self.fiat_curr
@property
def get_code_xml(self):
crypto_xml = CryptoCurrency.symbol_xml_crypto
fiat_xml = FiatCurrency.symbol_xml_fiat
code_xml = '{}{}'.format(crypto_xml, fiat_xml)
return code_xml
def save(self, *args, **kwargs):
self.code_xml = self.get_code_xml
super(ExchangeDirection, self).save(*args, **kwargs)
def __str__(self):
return f'{self.crypto_curr}/{self.fiat_curr}'
class Meta:
verbose_name = 'направление обмена'
verbose_name_plural = 'направления обмена'
class FiatCurrency(models.Model):
title = models.CharField('Название', max_length=32)
symbol = models.CharField('Символ', max_length=32)
symbol_xml_fiat = models.CharField('Символ XML', max_length=1024, default='-')
min_amount_buy = models.DecimalField('Мин. сумма покупки', default=1.0, decimal_places=2, max_digits=100)
max_amount_buy = models.DecimalField('Макс. сумма покупки', default=1.0, decimal_places=2, max_digits=100)
min_amount_sell = models.DecimalField('Мин. сумма продажи', default=1.0, decimal_places=2, max_digits=100)
max_amount_sell = models.DecimalField('Макс. сумма продажи', default=1.0, decimal_places=2, max_digits=100)
wallets = models.TextField('Кошельки', max_length=512, blank=True, default=None, null=True)
wallets.help_text = "Через пробел или перенос строки."
wallet_template = models.CharField('Шаблон кошелька', max_length=256, default='.+')
wallet_example = models.CharField('Пример кошелька', max_length=256, default='-')
symbol.help_text = "Пример: USD, BTC, ETH. Используется для получения курса через Binance API."
wallet_template.help_text = "Регулярное выражение."
symbol_xml_fiat.help_text = 'Код из XML файла выгрузки курсов обменника'
@property
def round(self):
return 2
def __str__(self):
return str(self.title)
class Meta:
verbose_name = 'фиатная валюта'
verbose_name_plural = 'фиатные валюты'
class CryptoCurrency(models.Model):
title = models.CharField('Название', max_length=32)
symbol = models.CharField('Символ', max_length=32)
symbol_xml_crypto = models.CharField('Символ XML', max_length=32, default='')
min_amount_buy = models.DecimalField('Мин. сумма покупки', default=1.0, decimal_places=50, max_digits=100)
max_amount_buy = models.DecimalField('Макс. сумма покупки', default=1.0, decimal_places=50, max_digits=100)
min_amount_sell = models.DecimalField('Мин. сумма продажи', default=1.0, decimal_places=50, max_digits=100)
max_amount_sell = models.DecimalField('Макс. сумма продажи', default=1.0, decimal_places=50, max_digits=100)
round = models.IntegerField('Знаков после зап.', default=2)
wallets = models.TextField('Кошельки', max_length=512, blank=True, default=None, null=True)
wallets.help_text = "Через пробел или перенос строки."
wallet_template = models.CharField('Шаблон кошелька', max_length=256, default='.+')
wallet_example = models.CharField('Пример кошелька', max_length=256, default='-')
symbol.help_text = "Пример: USD, BTC, ETH. Используется для получения курса через Binance API."
symbol_xml_crypto.help_text = 'Код из XML файла выгрузки курсов обменника'
wallet_template.help_text = "Регулярное выражение."
def __str__(self):
return str(self.title)
class Meta:
verbose_name = 'криптовалюта'
verbose_name_plural = 'криптовалюты'
В admins.py модели зарегистрированы.
Необходимо сохранять, значения полей code_xml, каждого направления обмена в базу данных в таблицу ExchangeDirection, столбец code_xml
У меня сохраняется не значение этого поля а объект, в базе сохраняется строка <django.db.models.query_utils.DeferredAttribute object at 0x7fb638446220><django.db.models.query_utils.DeferredAttribute object at 0x7fb638446d00
Решил проблему!
def get_code_xml(self):
crypto_xml = self.crypto_curr.symbol_xml_crypto
fiat_xml = self.fiat_curr.symbol_xml_fiat
code_xml = '{}{}'.format(crypto_xml, fiat_xml)
return code_xml