查询集花费太多时间

时间:2019-07-04 05:47:06

标签: python django pandas dictionary django-queryset

我也从数据库计算了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

我还没有在查询中添加乘积的一部分。

这是每个项目的

1 个答案:

答案 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'
)