Python 特定科目特定学生的加权平均数
我已经学习Python几天了,我已经尝试完成了一个小的Django模型 我现在的目标是能够为一个学生分配一个特定科目(例如物理)的加权分数,然后将这些加权分数相加,返回一个学生该科目的加权平均值 例如,学生A的物理成绩为3分(分数)*2分(体重),3*3分,数学成绩为2*4分,3*1分。我的目标是回归: 学生APython 特定科目特定学生的加权平均数,python,django,Python,Django,我已经学习Python几天了,我已经尝试完成了一个小的Django模型 我现在的目标是能够为一个学生分配一个特定科目(例如物理)的加权分数,然后将这些加权分数相加,返回一个学生该科目的加权平均值 例如,学生A的物理成绩为3分(分数)*2分(体重),3*3分,数学成绩为2*4分,3*1分。我的目标是回归: 学生A 物理平均:2.5 学生A 数学平均分:2.2 目前,我一直试图通过这种方式实现它,但它不起作用。加权平均值根本不会显示 班级分数(models.Model): 比例=模型。正整数域(选项
物理平均:2.5 学生A
数学平均分:2.2 目前,我一直试图通过这种方式实现它,但它不起作用。加权平均值根本不会显示
班级分数(models.Model):
比例=模型。正整数域(选项=比例\u列表)
学生=models.ForeignKey(学生,on_delete=models.CASCADE)
subject=models.ForeignKey(subject,on_delete=models.CASCADE)
task=models.ForeignKey(任务,on_delete=models.CASCADE)
权重=models.PositiveIntegerField(默认值=1)
def加权评分(自我):
返回自秤*自重
加权评分=属性(加权评分)
def加权平均值(自身):
qs=self.objects.all().annotate(
分数=总和(“量表”),
加权总和=总和(“权重”),
加权平均值=Sum((F('scale')*F('weight')),输出字段=FloatField())/Sum('weighted_Sum'),输出字段=FloatField()
)
返回加权平均值
加权平均=属性(加权平均)
谢谢。这可能是问题所在:
def _weighted_average(self):
qs = self.objects.all().annotate(
score_sum = sum('scale'),
weighted_sum = sum('weight'),
weighted_avg = Sum((F('scale') * F('weight')), output_field=FloatField() ) / Sum('weighted_sum'), output_field=FloatField()
)
return weighted_avg
首先,为了清晰和简洁,您可以使用@property
或Django的cached_属性。不管怎样,你面临的问题是如何使用self
。Self指的是您正在使用的给定对象。它是一个单独的实例,例如像.get()
而不是.filter()
,因此您不能再链接那些queryset内容
您是否打算基于当前筛选器创建查询集?如果是这样,您应该将其设置为@classmethod
,如下所示:
class Blah(models.Model):
id = BigAutoField()
@classmethod
def blah(cls, qs):
return qs.filter("more filters")
@property
def get_id(self):
return self.id
hi = Blah.objects.get(id=1)
filtered_or_anotated = Blah.blah(qs=hi)
# It's still a single object, but more filtered which of course is redundant.
print(filtered_or_anotated)
# Will show multiple objects since you're adding more filters
print(Blah.blah(Blah.objects.filter(id__in=[1,3,5])))
# Just for property clarity
print(hi.get_id) # 1
但是说“它不起作用”是没有用的。更新问题以显示代码的实际功能,并解释这与您想要的有何不同。@JohnGordon您是对的。它根本不显示加权平均值。既不是通过API也不是在应用程序中。这里没有显示任何内容的代码;你只给我们看了一个模型。如果问题出在显示上,那么你需要向我们展示代码。哦,这是有道理的,是的。我还没有创建任何视图,我现在只在django的管理面板、终端和restapi上操作。谢谢回复。事实上,我的意图是创建一个查询集,将学生ID和科目ID一起计算,然后计算这两个ID的所有分数并返回平均值。如果我的解决方案不适用于您,那么您可以获取当前类的类型:
self.\uuuuu class\uuuuuuuu.objects.all()