如何在视图中访问 属性(django)

how to access to property in view(django)

我是初学者,我需要一些解决方案

首先,我有 Racket 和 Detail class。

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)

其次,我想使用@属性(adminAvgScore) 对列表进行排序,所以我制作了这样的视图。

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

不幸的是,当我使用 'RacketDetail' class 的列时,我可以使用“order_by('detail__”访问除 'adminAvgScore' 之外的所有列。

如果我使用类似“order_by('detail__adminAvgScore')”,那么 Django 会向我显示错误“BigAutoField 不支持的查找 'adminAvgScore' 或不允许加入该字段。”

我该如何解决?或者我应该换一种方式思考?

您不能将 属性 与查询一起使用,因为 属性 是函数。您可以使用注释和聚合组合来获得结果作为您的 属性 函数,但在 query.Something 中这样就可以了。

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')))