修改列表视图查询集以汇总包含具有相同值的列的 table
modify a listview queryset to summarize a table containing columns with same value
我有2个模型;一个用于 material 定义,另一个用于股票跟踪。我需要一只股票 table,因为会有相同的 material 具有不同的到期日。我正在使用 Django 通用列表视图,并希望修改查询集以显示 material 数量的汇总列表。
例如:
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 %}
无论你在哪里做这个,你实际上都需要翻转查询;您需要获取 Materials 的列表,并计算它们的库存数量。
所以:
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 开始的。
我有2个模型;一个用于 material 定义,另一个用于股票跟踪。我需要一只股票 table,因为会有相同的 material 具有不同的到期日。我正在使用 Django 通用列表视图,并希望修改查询集以显示 material 数量的汇总列表。
例如:
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 %}
无论你在哪里做这个,你实际上都需要翻转查询;您需要获取 Materials 的列表,并计算它们的库存数量。
所以:
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 开始的。