Как я могу вычислить 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())
)
Вернуться на верх