Преобразовать поле цены в Джанго, чтобы быть в определенной валюте - PullRequest
0 голосов
/ 17 октября 2018

У меня есть модель продукта, которая имеет поле цены и поле валюты.Пользователь может сохранять разные продукты, используя разные валюты.некоторые продукты сохраняются в usd, некоторые в gbp и т. д. ..

class Product(models.Model):


    price = models.DecimalField(decimal_places=1, 
                                max_digits=4, 
                                default=0)
    usd = 'USD'
    nis = 'NIS'
    gbp = 'GBP'
    CURRENCY_CHOICES = (
        (usd , 'USD'),
        (nis, 'NIS'),
        (gbp, 'GBP')
    )
    currency = models.CharField(
        max_length=3,
        choices=CURRENCY_CHOICES,
        default=usd,
        blank=True
    )

Я хочу иметь возможность сортировать и просматривать все продукты в одной валюте.Как я могу добавить поле price_in_usd, которое будет установлено автоматически, когда будут установлены поля «цена» и «валюта»?

примерно так, например:

price_in_usd = convert_price_to_usd()
convert_price_to_usd():
 if currency == GPB:
    return price*1.25
 if currency == NIS:
    return price*0.33

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете использовать метод 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...