如何在视图中访问 属性(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')))
我是初学者,我需要一些解决方案
首先,我有 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')))