我也从数据库计算了3000个项目的一些值。从选择框中选择项目时,字段应由jquery填充。
我正在迭代每个项目,将其发送到字典中(项目名称作为键,变量元组作为值),然后将此字典传递给Django模板。
我要在模板中发送auto_dict词典。每次用户从change
函数的选择框中选择值时,我都会迭代字典并获取值。
页面加载时间过多。
class Sales(models.Model): # sales detail of items
item_id = models.ForeignKey('Item', models.DO_NOTHING)
# some more fields
class Item(models.Model): # detail of items, around 3000 items
name = models.CharField(max_length=127)
# some more fields
class Order(models.Model): # order detail of each order
order_number = models.CharField(max_length=63, unique=True)
created_at = models.DateField(auto_now_add=True)
status = models.CharField(max_length=2, choices=STATUS, blank=True, null=True, default='NP')
final_approval = models.CharField(max_length=3,default='No')
order_type = models.CharField(max_length=2, blank=True, null=True, choices=ORDER_TYPE)
# some more fields
class Orderitems(models.Model): # item detail for all order
qty = models.IntegerField()
item_id = models.ForeignKey(Item, models.DO_NOTHING, blank=True, null=True)
order_id = models.ForeignKey(Order, models.DO_NOTHING, blank=True, null=True)
sales_id = models.ForeignKey(Sales, models.DO_NOTHING, blank=True, null=True)
# some more fields
我要总计(创建日期和今天之间的差额)。
created_at = models.DateField(auto_now_add=True)
我正在使用这个:
current_date = datetime.date.today()
time_diff = OrderItemTable.objects.annotate(days=Sum((F('prev_order_items__order_id__created_at')-current_date)))
但是这个给出的答案像181715600.0。我想要这样的东西:
第一个订单-01/07/2019,diff = 4天* 2(数量)
2阶-03/07/2019,diff-2天* 3(数量)
总和= 14
我还没有在查询中添加乘积的一部分。
这是每个项目的
答案 0 :(得分:1)
我认为您可以在单个查询中执行某些操作。例如:
假设您已经定义了related_names
,
class OrderOrderitemsTable(...):
item = models.ForeignKey(Item, related_name='prev_order_items')
class OrderItemSales(...):
item = models.ForeignKey(Item, related_name='sales_order_items')
然后您可以使用aggregation
这样运行查询:
OrderItemTable.objects.annotate(
prev_sum_order=Sum('item__prev_order_items__qty')
).annotate(
sale_sum_order=Sum('item__sale_order_items__qty')
).annotate(
rating=F('sale_sum_order')/F('sale_sum_order')
).annotate(
in_wirehouse = Sum('item__qty_in_ferma_warehouse')
)
.values(
'prev_sum_order',
'sale_sum_order',
'rating',
'in_wirehouse'
)