Как получить доступ к свойству в представлении (django)

Я начинающий и мне нужно решение

Сначала у меня есть Racket и класс Detail.

class Racket(models.Model):
name = models.CharField(max_length=20)

class RacketDetail(models.Model):
   racket = models.OneToOneField(Racket, related_name='detail', on_delete=models.CASCADE)
   adminReview = models.TextField()
   adminPower = models.FloatField(default=0)
   adminSpin = models.FloatField(default=0)
   adminManeuverability = models.FloatField(default=0)
   adminStability = models.FloatField(default=0)
   adminComfort = models.FloatField(default=0)

   @property
   def adminAvgScore(self):
       scoreAvg = (
                       self.adminPower +
                       self.adminSpin +
                       self.adminManeuverability +
                       self.adminStability +
                       self.adminComfort
               ) / 5
       return round(scoreAvg, 2)

Второе, я хочу ранжировать список, используя @property(adminAvgScore), поэтому я сделал представление следующим образом.

def racketMain(request: HttpRequest):
   getRacket = Racket.objects.all().order_by('detail__adminAvgScore')
   return render(request, "racket/racketMain.html", {'racketItems': getRacket, })

К сожалению, когда я использую колонку класса 'RacketDetail', я могу получить доступ ко всем колонкам, кроме 'adminAvgScore', используя "order_by('detail__".

Если я использую "order_by('detail__adminAvgScore')", то Django показывает мне ошибку "Unsupported lookup 'adminAvgScore' for BigAutoField or join on the field not permitted"

Как я могу решить эту проблему? Или я должен думать по-другому?

Вы не можете использовать свойство с запросом, так как свойство - это функция. Вы можете использовать комбинацию annotate и aggregate, чтобы получить результат как ваша функция свойства, но внутри запроса.Что-то вроде этого сделает трюк.

from django.db.models import F, Sum, FloatField, Avg
Model.objects.filter(...)\
    .values('id')\
    .annotate(subtotal=Sum(...math here..., output_field=FloatField()))\
    .aggregate(total=Avg(F('subtotal')))
Вернуться на верх