Запрос к модели 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')
)