python - 如何在 django get_context_data() 中对 2 列求和

标签 python django

我想在 ClassBasedView 的 get_context_data 方法中返回总值(value)作为收入变量。

我还想返回另一个操作:total -shipping_costrevenue_no_shipping_cost上下文中的变量。

我已经尝试过:

from django.db.models import F, Sum

class OrdersListView(PermissionRequiredMixin,ListView):

    model = Order
    permission_required = 'is_staff'
    template_name = "order/revenue.html"
    paginate_by = 10

    def get_queryset(self):
        filter_month = self.request.GET.get('filtromes', '0')
        if filter_month == "0":
            return Order.objects.filter(status = 'recibido_pagado')
        else:
            return (Order.objects
                .filter(created__month=filter_month, status = 'recibido_pagado'))

    def get_context_data(self, **kwargs):
        context = super(OrdersListView, self).get_context_data(**kwargs)
        qs = kwargs.pop('object_list', self.object_list)
        order = self.request.GET.get('orderby', 'created')
        context = {}
        revenue = qs.aggregate(revenue=Sum('total'))
        revenue_no_shipping = qs.annotate(revenue_no_shipping=F('total') + F('shipping_cost'))
        context['revenue'] = revenue
        context['revenue_no_shipping'] = revenue_no_shipping
        context['filtromes'] = self.request.GET.get('filtromes', '0')
        context['orderby'] = self.request.GET.get('orderby', 'created')
        context['category'] = "catalogo"
        return context

但是在模板中,我得到:

收入:{'revenue': Decimal('42')} #is 42.00
对于收入_无运费:<QuerySet [<Order: 58>]> #Should be 25.00

models.py:

class Order(models.Model):
    ORDER_STATUS = (
        ('recibido_pagado', 'Recibido y pagado'),
        ('recibido_no_pagado', 'Recibido pero no pagado'),
        ('en_proceso', 'En proceso'),
        ('en_camino', 'En camino'),
        ('entregado', 'Entregado'),
        ('cancelado', 'Cancelado por no pagar' )
    )
    token = models.CharField(max_length=100, blank=True, null=True)
    first_name = models.CharField(max_length=50, blank=True, null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    phone_number = models.CharField(max_length=30, blank=True)
    total = models.DecimalField(max_digits=10, decimal_places=2)
    stickers_price = models.DecimalField(max_digits=10, decimal_places=2)
    discount = models.DecimalField(max_digits=10, decimal_places=2, default=Decimal('0.00'))
    shipping_cost = models.DecimalField(max_digits=10, decimal_places=2)
    email = models.EmailField(max_length=250, blank = True, verbose_name= 'Correo electrónico')
    last_four = models.CharField(max_length=100, blank=True, null=True)
    created = models.DateTimeField(auto_now_add=True)
    shipping_address = models.CharField(max_length=100, blank=True, null=True)
    shipping_address1 = models.CharField(max_length=100, blank=True, null=True)
    reference = models.CharField(max_length=100, blank=True, null=True)
    shipping_department = models.CharField(max_length=100, blank=True, null=True)
    shipping_province = models.CharField(max_length=100, blank=True, null=True)
    shipping_district = models.CharField(max_length=100, blank=True, null=True)
    reason = models.CharField(max_length=400, blank=True, null=True, default='')
    status = models.CharField(max_length=20, choices=ORDER_STATUS, default='recibido_pagado')
    comments = models.CharField(max_length=400, blank=True, null=True, default='')
    cupon = models.ForeignKey('marketing.Cupons', blank=True, null=True, default=None, on_delete=models.SET_NULL)


    class Meta:
        db_table = 'Order'
        ordering = ['-created']

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

    def igv(self):
        igv = int(self.total) * 18/100
        return igv

    def shipping_date(self):
        shipping_date = self.created + datetime.timedelta(days=10)
        return shipping_date

    def deposit_payment_date(self):
        deposit_payment_date = self.created + datetime.timedelta(days=2)
        return deposit_payment_date

更新1:

模板中的 HTML

<h1>Ordenes recibidas y pagadas:</h1>
<p> {{ revenue }}</p>

<h1>Ordenes recibidas y pgadas (no shipping)</h1>
<p> {{ revenue_no_shipping }}</p>

enter image description here

更新了 get_context_data 方法:

def get_context_data(self, **kwargs):
        context = super(OrdersListView, self).get_context_data(**kwargs)
        qs = kwargs.pop('object_list', self.object_list)
        order = self.request.GET.get('orderby', 'created')
        context = {}
        revenue = qs.aggregate(revenue=Sum('total'))
        revenue_no_shipping = qs.aggregate(revenue_no_shipping=Sum(F('total') + F('shipping_cost')))
        context['revenue'] = revenue
        context['revenue_no_shipping'] = revenue_no_shipping
        context['filtromes'] = self.request.GET.get('filtromes', '0')
        context['orderby'] = self.request.GET.get('orderby', 'created')
        context['category'] = "catalogo"
        return context

最终答案:

基于 jmunsch 的回答我得到了正确的答案,只需添加:

 revenue = float(revenue['revenue']) #necessary to properly render in template / not as Decimal
        revenue_no_shipping = float(revenue_no_shipping['revenue_no_shipping']) #necessary to properly render in template / not as Decimal

在模板中正确渲染。

def get_context_data(self, **kwargs):
        context = super(OrdersListView, self).get_context_data(**kwargs)
        qs = kwargs.pop('object_list', self.object_list)
        order = self.request.GET.get('orderby', 'created')
        context = {}
        revenue = qs.aggregate(revenue=Sum('total'))
        revenue_no_shipping = qs.aggregate(revenue_no_shipping=Sum(F('total') - F('shipping_cost')))
        revenue = float(revenue['revenue']) #necessary to properly render in template / not as Decimal
        revenue_no_shipping = float(revenue_no_shipping['revenue_no_shipping']) #necessary to properly render in template / not as Decimal
        context['revenue'] = revenue
        context['revenue_no_shipping'] = revenue_no_shipping
        context['filtromes'] = self.request.GET.get('filtromes', '0')
        context['orderby'] = self.request.GET.get('orderby', 'created')
        context['category'] = "catalogo"
        return context

最佳答案

像这样的东西可能适用于如何使用 django 对两列求和:

qs.aggregate(revenue_no_shipping=Sum(F('total') - F('shipping_cost')))

关于python - 如何在 django get_context_data() 中对 2 列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58330348/

相关文章:

python - 解决列表中项目的产品中的零

python - 在 vs code python 调试控制台中运行循环/多行

python - uWSGI master 如何与进程/worker 通信?

python - 在 django 查询集中排列键顺序

django - 'unique_together' 指的是不存在的字段

mysql - 按出现次数排序查询集

python - Pandas 正确打印到屏幕,但仅将一些数据保存到 csv

python - 为什么这个简单的两行 python 网页抓取代码在 python 解释器中可以正确执行,但在我的 PC 上却不能?

python - Django postman 使用另一个用户字段作为收件人标识符

python - Django 中的完整性错误,其中项目有两个用户表?