Запрос к модели django для сравнения дневной продажи с предыдущим днем (сравнение двух строк модели базы данных)
У меня есть модель django, которая является "DailyReport" продажи компаний Я хочу узнать изменение продажи компании за предыдущий день. Модель, которую я определяю, выглядит следующим образом:
class DailyReport(models.Model):
    company = models.CharField(max_length=50)
    sale = models.IntegerField()
    date = models.DateField()
Как я могу решить эту проблему, чтобы добавить новый столбец для каждого отчета, который представляет скорость изменения за предыдущий день
Предполагая, что у вас может быть только одна запись о компании для каждого дня, вы можете создать свойство модели:
@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')
)
                    