是否可以在从基于类的视图返回的查询集中添加额外值(查询中的2个字段的计算)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在从基于类的视图返回的查询集中添加额外值(查询中的2个字段的计算)相关的知识,希望对你有一定的参考价值。

我试图为从基于类的视图返回的查询添加值。我的Db由用户组成,用户可以有许多交易,而交易可以有很多销售。我想通过((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)

答案

如果通过将值添加到查询集,则表示该值应该可用于查询集的项目,您可以在Sale上创建一个执行该计算的属性:

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

您可以稍后在模板中将其用作{{ sale.profit_loss }}

另一答案

可以使用注释(参见Aggregations):

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

以上是关于是否可以在从基于类的视图返回的查询集中添加额外值(查询中的2个字段的计算)的主要内容,如果未能解决你的问题,请参考以下文章

向基于类的视图添加额外内容并对其进行过滤

我可以在从 Access DB 填充的组合框顶部添加一个额外的行吗

表单 ModelChoiceField 查询集 + 额外选择字段 django 表单

Django 基于类的视图是不是自动为模板分配表单值

为啥查询的数据在结果集中返回而不是在数组中?

创建视图 + 查询(组合列 + 添加额外属性)