Есть ли способ в Django объединить два запроса одной модели с разными параметрами? - PullRequest
0 голосов
/ 28 января 2019

Я хотел бы иметь возможность отображать таблицу с текущим значением магазинов, а также значением за прошлый год.Прямо сейчас я запрашиваю все магазины, а затем для каждого магазина я прохожу цикл и получаю значение из даты и времени сравнения.Но для этого нужно более 60 запросов.

Вот мои модели.Все данные хранятся в модели ShowroomData

class Stores(models.Model):
    storeid = models.IntegerField(default=0, primary_key=True)
    location = models.CharField(max_length=128)

class ShowroomData(models.Model):
    store = models.ForeignKey(Stores, db_column="storeid", default=0, on_delete=models.CASCADE)
    date = models.DateField(db_index = True)  # Field name made lowercase.
    time = models.IntegerField()  # Field name made lowercase.
    sales = models.DecimalField(max_digits=10, decimal_places=2)  # Field name made lowercase.
    tax = models.DecimalField(max_digits=10, decimal_places=2)  # Field name made lowercase.

Мои views.py

    for store in current_data:
        comparison_data = ShowroomData.objects.filter(store=self.store, date=comparison_date, time=self.time)
        if comparison_data:
            for record in comparison_data:
                store.compare_amount = record.sales + record.tax

Я хотел бы иметь возможность хранить все эти данные в одном наборе запросов, а затемЗацикливайте его в шаблонах вместо того, чтобы вначале повторять цикл для повторного добавления запроса.Если вообще возможно иметь данные из второго запроса в отдельном поле в наборе запросов?Спасибо!

1 Ответ

0 голосов
/ 28 января 2019

Очень простое решение возможно с агрегацией .

annotate () используется для создания сводок по объектам, в то время какобъект F , в вашем случае, используется для суммирования двух полей.

ShowroomData.objects.annotate(compare_amount=F('sales')+F('tax')).filter(store=self.store, date=comparison_date, time=self.time))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...