Вы можете использовать метод clean()
для обработки такого рода поведения.
class Product(models.Model):
price = models.DecimalField(decimal_places=1, max_digits=4, default=0)
currency = models.CharField(
max_length=3,
choices=CURRENCY_CHOICES,
default=usd,
blank=True
)
price_in_usd = models.DecimalField(decimal_places=1, max_digits=4, default=0, editable=False)
def clean(self):
if self.price and self.currency:
self.price_in_usd = convert_price_to_usd(self.price, self.currency)
См. Django docs , чтобы точно знать, когда будет вызван метод clean()
.В зависимости от того, что вы делаете, вам, возможно, придется позвонить прямо full_clean()
, прежде чем звонить save()
.Также clean()
не будет вызываться, если вы, например, используете QuerySet.update()
или bulk_create()
.
Другим способом решения этой проблемы может быть реализация этого на уровне SQL с использованием, например, триггеров.
Однако, если вы хотите, чтобы цена в долларах США обновлялась (ежечасно, ежедневно или как угодно), чтобы всегда соответствовать текущему курсу изменения, вам придется использовать задание cron для регулярного обновления price_in_usd
.
Если вам не нужно сортировать данные по price_in_usd
на уровне базы данных, другое решение заключается в использовании свойства:
class Product(models.Model):
price = models.DecimalField(decimal_places=1, max_digits=4, default=0)
currency = models.CharField(
max_length=3,
choices=CURRENCY_CHOICES,
default=usd,
blank=True
)
@property
def price_in_usd(self):
return convert_price_to_usd(self.price, self.currency)