Как получить доступ к свойству в представлении (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')))