Как выбрать отдельный столбец A, а затем агрегировать значения столбца B в DJANGO?

#python #django #django-views #django-queryset

Вопрос:

Я пытаюсь создать веб-страницу крипто-портфолио. Моя проблема заключается в следующем. Таблица текущих транзакций при отображении html:

Имя крипто_ Общая Торговая Стоимость
УСТРОЙСТВО для очистки сточных вод 150
УСТРОЙСТВО для очистки сточных вод 100
ДОЖ 200
ДОЖ 210

Таблица требуемых транзакций:

Имя крипто_ Общая Торговая Стоимость
УСТРОЙСТВО для очистки сточных вод 250
ДОЖ 410

Я хотел бы выбрать различные значения Crypto_Name и затем суммировать значения в общей торговой стоимости.

models.py:

 class Transaction(models.Model):
    """Model representing a trade."""
    portfolio = models.ForeignKey('Portfolio',on_delete=models.CASCADE)
    coin = models.ForeignKey(Coin,on_delete=models.CASCADE)
    number_of_coins = models.DecimalField(max_digits=10, decimal_places=0)
    trade_price = models.DecimalField(max_digits=10, decimal_places=2)
    date = models.DateField()

    def __str__(self):
        return str(self.portfolio)   

    @property
    def total_trade_value(self):
        return self.trade_price * self.number_of_coins
 

views.py запрос:

 def my_portfolio(request):
    filtered_transaction_query_by_user = Transaction.objects.filter(portfolio__user=request.user)
    ...
 

То, что я пробовал среди многих вещей:

 test = filtered_transaction_query_by_user.order_by().values('coin__name').distinct()
 

Это дает мне всего два криптографических имени в уродливом формате

 {'coin__name': 'Bitcoin'}
{'coin__name': 'Doge'}
 

но другие столбцы пусты, когда я отображаю их в html.

Я ценю вашу помощь!!! 🙂

ОБНОВЛЕНИЕ: Большое спасибо @HudsonBarroso за ответ:

 test = filtered_transaction_query_by_user.values('coin__name').annotate( total = (Sum(trade_price ) * Sum(number_of_coins))).order_by('-total') 
 

Ответ №1:

попробуйте это:

 from django.db.models import Sum
        
test = filtered_transaction_query_by_user.values('coin__name').annotate(
total = (Sum(trade_price ) * Sum(number_of_coins))).order_by('-total')
 

Комментарии:

1. .values('coin_name') измените это на .values('coin__name') (дополнительное _ , так как это поле связанной модели).

2. Спасибо за быстрый ответ @HudsonBarroso, я добавил дополнительный » для «total_trade_value» для работы. К сожалению, это работает для каждого поля модели, но не для значения total_trade_: не удается разрешить ключевое слово «total_trade_value» в поле. Выбор: монета, идентификатор монеты, дата, идентификатор, количество монет, портфель, идентификатор портфеля, торговая цена.Это метод модели. У вас есть какие-нибудь предложения?

3. Попробуйте еще раз: test = filtered_transaction_query_by_user.значения(‘имя монеты__’). аннотировать( итого = (Сумма(trade_price ) * Сумма(number_of_coins))). заказ_би(‘-итого’)

4. Это было решением проблемы. Спасибо вам за помощь @HudsonBarroso . Большой голос!

5. Это здорово, в любое время, когда вам понадобится @Neat1!