Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 特定科目特定学生的加权平均数_Python_Django - Fatal编程技术网

Python 特定科目特定学生的加权平均数

Python 特定科目特定学生的加权平均数,python,django,Python,Django,我已经学习Python几天了,我已经尝试完成了一个小的Django模型 我现在的目标是能够为一个学生分配一个特定科目(例如物理)的加权分数,然后将这些加权分数相加,返回一个学生该科目的加权平均值 例如,学生A的物理成绩为3分(分数)*2分(体重),3*3分,数学成绩为2*4分,3*1分。我的目标是回归: 学生A 物理平均:2.5 学生A 数学平均分:2.2 目前,我一直试图通过这种方式实现它,但它不起作用。加权平均值根本不会显示 班级分数(models.Model): 比例=模型。正整数域(选项

我已经学习Python几天了,我已经尝试完成了一个小的Django模型

我现在的目标是能够为一个学生分配一个特定科目(例如物理)的加权分数,然后将这些加权分数相加,返回一个学生该科目的加权平均值

例如,学生A的物理成绩为3分(分数)*2分(体重),3*3分,数学成绩为2*4分,3*1分。我的目标是回归:

学生A
物理平均: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()