修改列表视图查询集以汇总包含具有相同值的列的表

Posted

技术标签:

【中文标题】修改列表视图查询集以汇总包含具有相同值的列的表【英文标题】:modify a listview queryset to summarize a table containing columns with same value 【发布时间】:2020-01-26 12:10:42 【问题描述】:

我有 2 个模型;一个用于物料定义,另一个用于库存跟踪。我需要一个库存表,因为会有相同的材料具有不同的有效期。我正在使用 django 通用列表视图,并希望修改查询集以显示将汇总的材料数量的汇总列表。

例如:

stocks_table:

name    packing_details    expiry_date    quantity
milk    1lt boxes          11/11/2019     30
milk    1lt boxes          12/12/2019     40

after modifiying the queryset :

name    packing_details    quantity
milk    1lt boxes          70

是否可以使用通用列表视图或者我应该准备一个基于函数的视图?

型号

class Material(models.Model):

    name = models.CharField(max_length=500)
    packing_details = models.CharField(max_length=500)
    material_unit = models.CharField(max_length=3)
class Stock(models.Model):
    material = models.ForeignKey(Material, on_delete=models.CASCADE)
    expiry_date = models.DateField()
    quantity = models.DecimalField(max_digits=10, decimal_places=2)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    date_created = models.DateField(default=timezone.now)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, default=1)

查看

class StocksListView(LoginRequiredMixin, ListView):
    model = Stock
    context_object_name = 'stocks'

模板

            % for stock in stocks %
                <tr>
                    <td class="text-center"> stock.material.name </td>
                    <td class="text-center"> stock.material.packing_details </td>
                    <td class="text-center"> stock.quantity </td>
                    <td class="text-center"> stock.price </td>
                </tr>
            % endfor %

【问题讨论】:

请显示您当前的视图和模板。 【参考方案1】:

无论您在哪里执行此操作,您实际上都需要翻转查询;您需要获得一份材料清单,并汇总它们的库存数量。

所以:

from django.db.models import Sum

Material.objects.annotate(quantity=Sum('stock__quantity')).filter(quantity__gt=0)

您可以直接将其设置为视图中的查询集:

class StocksListView(LoginRequiredMixin, ListView):
    queryset = Material.objects.annotate...

现在您需要从 Material 而不是 Stock 开始更新您的模板。

【讨论】:

以上是关于修改列表视图查询集以汇总包含具有相同值的列的表的主要内容,如果未能解决你的问题,请参考以下文章

仅包含具有更新值的列的动态更新语句

连接具有相同值的行的列值(不同列的)

Oracle:查找只有空值的列

具有列表值的列,如果列表具有超过 1 个元素,则解码这两个值并包含在新列的同一行中的列表中

具有重复值的列上的数据库索引

如何过滤具有列表的列的数据框包含值[重复]