Запрос к модели django для сравнения дневной продажи с предыдущим днем (сравнение двух строк модели базы данных)

У меня есть модель django, которая является "DailyReport" продажи компаний Я хочу узнать изменение продажи компании за предыдущий день. Модель, которую я определяю, выглядит следующим образом:

class DailyReport(models.Model):
    company = models.CharField(max_length=50)
    sale = models.IntegerField()
    date = models.DateField()

Как я могу решить эту проблему, чтобы добавить новый столбец для каждого отчета, который представляет скорость изменения за предыдущий день

the tables that i wanna to show in view

Предполагая, что у вас может быть только одна запись о компании для каждого дня, вы можете создать свойство модели:

@property
def previous_day_sale(self):
  date = self.date 
  dr = DailyReport.objects.filter(company=self.company, date=date-timedelta(days=1)
  if dr:
    return dr.first().sale - self.sale

Возможно, вам придется переопределить метод сохранения, но при этом вы должны будете охватить все крайние случаи.

class DailyReport(models.Model):
    company = models.CharField(max_length=50)
    sale = models.IntegerField()
    date = models.DateField()
    sale_over_previous_day = models.IntegerField()
    
    def save(self, *args, **kwargs):
        previous_day_sale_object = DailyReport.objects.filter(company=self.company, date=date-timedelta(days=1))
        if previous_day_sale_object:
            previous_day_sale = previous_day_sale_object[0].sale
        else:
            previous_day_sale = 0
        self.sale_over_previous_day = self.sale - previous_day_sale
        super(DailyReport, self).save(*args, **kwargs)

Используйте функцию окна Lag для аннотации каждой строки с предыдущей суммой продажи для этой компании.

Затем используйте другую аннотацию для расчета разницы между текущей и предыдущей продажей

from django.db.models import Window, F
from django.db.models.functions import Lag

DailyReport.objects.annotate(
    prev_val=Window(
        expression=Lag('sale', default=0),
        partition_by=['company'],
        order_by=F('date').asc(),
    )
).annotate(
    diff=F('sale') - F('prev_val')
)
Вернуться на верх