Как я могу вычислить Position на основе другого поля экземпляра модели Django?
У меня есть модель Django, которая выглядит следующим образом:
class Image(models.Model):
name = models.CharField(max_length=60)
description = models.CharField(max_length=60, null=False)
clicks = models.IntegerField(default=0)
views = models.IntegerField(default=0)
@property
def weight(self) -> float:
return round((self.clicks * 0.7 + self.views * 0.3), 2)
На основе weight
я хотел бы оценить position
поле Image
. Это должно дать position
, основанное на weight
всех экземпляров Image
. Чем выше weight
, тем выше position
(позиция 1 - наибольший вес, позиция 2 - второй по величине и т.д.)
Как я могу создать функцию, которая возьмет ВСЕ Image
экземпляры, которые у меня есть в БД, и вычислит position
для всех них?
Вы можете использовать функцию window для вычисления позиции каждого изображения с помощью RowNumber
from django.db.models import Window, F
from django.db.models.functions import RowNumber
images_with_position = Image.objects.annotate(
weight=F('clicks') * 7 + F('views') * 3
).annotate(
position=Window(expression=RowNumber(), order_by=F('weight').desc())
)