Queryset занимает слишком много времени - PullRequest
1 голос
/ 04 июля 2019

Я тоже рассчитал некоторые значения для 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. Я хочу что-то вроде этого:

1-й заказ - 01/07/2019, разность = 4 дня * 2 (количество)

2-й заказ - 03/07/2019, разность - 2 дня * 3 (количество)

Сумма = 14

Я еще не добавил умножающую часть продукта в запрос.

Это для каждого предмета.

1 Ответ

1 голос
/ 04 июля 2019

Я думаю, что вы можете выполнить некоторые операции в одном запросе. Например:

Допустим, у вас есть 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'
)
...