Можно ли добавить дополнительное значение (вычисление 2 полей в запросе) к набору запросов, которое возвращается из представления на основе классов - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь добавить значение в запрос, который возвращается из представления на основе классов.Моя база данных состоит из пользователей, у пользователя может быть много транзакций, а транзакция может иметь много продаж.Я хочу рассчитать потерю прибыли от продажи с помощью ((sale.amount_per_coin - sale.transaction.amount_per_coin_sold) * sale.amount) и добавить ее к каждой возвращаемой строке.Возможно ли это сделать, и если да, то как мне поступить?

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

class Transaction(models.Model):
    currency = models.CharField(max_length=20)
    amount = models.IntegerField()
    total_price = models.DecimalField(max_digits=7, 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=7, 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)

Модель продажи ниже

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

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

представление на основе классаниже

class SaleListView(ListView):
    model = Sale
    template_name = 'webapp/sale.html'
    context_object_name = 'sales'
    paginate_by = 5

    def get_queryset(self):
        return super().get_queryset().filter(transaction__owner=self.request.user)

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Если при добавлении значения к набору запросов вы имеете в виду, что это значение должно быть доступно для элементов набора запросов, вы можете создать свойство на Sale, которое выполняет это вычислениекак таковой:

@property
def profit_loss(self):
    return (self.amount_per_coin - self.transaction.amount_per_coin_sold) * self.amount

, который позже вы можете использовать в своем шаблоне как {{ sale.profit_loss }}

0 голосов
/ 23 апреля 2019

Да возможно, просто используйте аннотацию (см. Агрегаты ):

sales = Sales.objects.filter(
    transaction=transaction      # Filter on the desire transaction.
).annotate(
    profit_lost=(F('amount_per_coin') - F('transaction__amount_per_coin_sold')) * F('amount')
)

теперь у вас будет атрибут proft_lost для каждого sale в наборе запросов sales.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...