Простая математика в представлениях Django с десятичными знаками - PullRequest
0 голосов
/ 27 октября 2018

Я в небольшом гамбите с этим вопросом здесь "преобразование из метода в десятичное не поддерживается django" ошибка , когда добавление () дает мне ошибку 'DeferredAttribute' object is not callable, а удаление их дает мне другое conversion from DeferredAttribute to Decimal is not supported (Моя текущая ошибка с кодом ниже)

Моя цель - взять два моих значения и выяснить, что такое прибыль или убыток:

Profit_long = (цена 1 - цена 2) * размер

* Я не уверен, что математический синтаксис правильный, потому что приведенное выше сообщение об ошибке не позволит мне зайти так далеко. Из того, что я прочитал, пока эти переменные являются целыми числами, математический синтаксис должен быть правильным. Не уверен, что он будет работать с десятичными знаками. Это второй шаг. Сначала мне нужно решить вышеуказанную проблему.

views.py

class TradeDetailView(DetailView):
template_name = 'tj/cp/trade/detail.html'

queryset = Trade.objects.all()

def get_object(self):
    id_ = self.kwargs.get("id")
    return get_object_or_404(Trade, id=id_)

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    entry_price = Decimal(Trade.entry_price)
    exit_price = Decimal(Trade.entry_price)
    size = Decimal(Trade.size)

    context['profit_long'] = (entry_price - exit_price) * size

    return context

models.py

class Trade(models.Model):
    ...
    size = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=2)
    entry_price = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=2)
    exit_price = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=2)
    ...

1 Ответ

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

Я изменил твой код для корректной работы:

class TradeDetailView(DetailView):
    template_name = 'tj/cp/trade/detail.html'
    pk_url_kwarg = 'id'
    model = Trade

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        entry_price = Decimal(self.object.entry_price)
        exit_price = Decimal(self.object.exit_price)
        size = Decimal(self.object.size)
        context['profit_long'] = (entry_price - exit_price) * size
        return context

Но лучше сделать по-другому.Добавьте свойство в модель Торговля:

class Trade(models.Model):
    # ...
    size = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=2)
    entry_price = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=2)
    exit_price = models.DecimalField(null=True, blank=True, max_digits=50, decimal_places=2)
    # ...

    @property
    def profit_long(self):
        return (self.entry_price - self.exit_price) * self.size

Тогда представление станет более кратким .:10000 *

class TradeDetailView(DetailView):
    template_name = 'tj/cp/trade/detail.html'
    pk_url_kwarg = 'id'
    model = Trade
    context_object_name = 'trade'

И используйте свойство в шаблоне django:

<p>Profit long: {{ trade.profit_long }}</p>
...