Могу ли я суммировать свойства в аннотации - PullRequest
0 голосов
/ 27 апреля 2019

Я создаю HTML-таблицу в своем проекте, которая заполняется некоторыми значениями суммы из моей базы данных, я пытаюсь суммировать (coins_remaining), которая является свойством моей модели базы данных.Coins_remaining рассчитывается путем вычитания (sum_amount_sold из Sale таблицы) из (amount из Transaction таблицы).Возможно ли это ?, если да, то как мне поступить?

HTML Таблица ниже

           {% for transaction in transactions %}
            <tr>
                <td>{{transaction.currency}}</td>
                <td>{{transaction.sum_amount_purchased}}</td>                
                <td>{{transaction.sum_total_price_purchased}}</td>
                <td>{{transaction.sum_total_price_purchased}}</td>
            </tr>
            {% endfor %}

Функция ниже

@login_required
def portfolio(request):



    context = {
        'transactions': Transaction.objects.filter(owner=request.user).values('currency').annotate(

            sum_amount_purchased=Sum('amount'),
            sum_total_price_purchased=Sum('total_price')),
            sum_amount_current=?

    }
    return render(request, 'webapp/portfolio.html', context, {'title': 'Portfolio'})

Модель транзакции ниже

class Transaction(models.Model):
    currency = models.CharField(max_length=20)
    amount = models.IntegerField()
    total_price = models.DecimalField(max_digits=8, decimal_places=2)
    date_purchased = models.DateTimeField()
    note = models.TextField(default="")
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    amount_per_coin = models.DecimalField(max_digits=8, decimal_places=2, editable=False)


    def save(self, *args, **kwargs):
        self.amount_per_coin = self.total_price / self.amount
        super(Transaction, self).save(*args, **kwargs)

    def __str__(self):
        return str(self.pk)+','+self.currency + ', '+str(self.amount)

    def get_absolute_url(self):
        return reverse('transaction-detail', kwargs={'pk': self.pk})

    @property
    def coins_remaining(self):
        return self.amount - sum(self.sales.all().values_list('amount_sold', flat=True))

Продажа модели ниже

class Sale(models.Model):
    amount_sold = models.IntegerField()
    total_price_sold = models.DecimalField(max_digits=8, decimal_places=2)
    date_sold = models.DateTimeField(default=timezone.now)
    note = models.TextField(default="")
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE, related_name="sales")
    amount_per_coin_sold = models.DecimalField(max_digits=8, decimal_places=2, editable=False)

    def __str__(self):
        return str(self.pk)+','+str(self.amount_sold) + ', '+self.note

    def save(self, *args, **kwargs):
        self.amount_per_coin_sold = self.total_price_sold / self.amount_sold
        super(Sale, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('sale-detail', kwargs={'pk': self.pk})

1 Ответ

1 голос
/ 27 апреля 2019

Вы можете использовать Subquery для этого. Примечание: , что вы должны использовать OuterRef, чтобы получить правильный Transaction. Не удалось проверить это по-настоящему, но именно так вы можете использовать Subquery, чтобы аннотировать набор запросов и впоследствии использовать его в вычислениях. Я не совсем уверен, решит ли это вашу проблему, но здесь вы идете:

coins_remaining_query = (
    Sale.objects.filter(transaction=OuterRef("id"))
    .annotate(coins_remaining=Sum("amount_sold"))
    .values("coins_remaining")
)

Transaction.objects.filter(owner=request.user).values("currency").annotate(
    sum_amount_purchased=Sum("amount"),
    sum_total_price_purchased=Sum("total_price"),
    coins_remaining=Subquery(coins_remaining_query)
).annotate(sum_amount_current=F("sum_amount_purchased")-F("coins_remaining"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...