如何在模型中注释来自其他模型的聚合

问题描述

我需要一些帮助来在我的三个模型中进行查询。第一个是Cyclist,有编号(pk)、姓名、生日等字段。第二个模型是带有id(pk)、分类类型、阶段编号、编号(外键)和分数的分类。我需要做的第一个查询是为每个骑自行车的人获取每个阶段编号的总分。

我的选择是:

puntos=Corredor.objects.values('dorsal','etapa').aggregate(total_puntos=Sum('puntos')

在那之后,我有一个团队模型。团队是由客户选择的一组自行车手。我想为每个团队获得组成该团队的自行车手的总积分,但在这种情况下,我不知道如何在新查询中使用查询 puntos 进行注释。也许:

team_points=Equipo.objects.annotate(F(Sum(lid__dorsal__puntos))+(Sum(lid2__dorsal__puntos))+...........)))

预先感谢您的帮助。

这些是模型:

class Corredor (models.Model):
    dorsal=models.IntegerField(primary_key=True)
    tipo=models.CharField(max_length=50)
    nombre=models.CharField(max_length=50)
    f_nacimiento=models.DateField(default=1/1/1975)
    nacimiento=models.IntegerField()
    categoria=models.CharField(max_length=50)
    pais=models.CharField(max_length=50)
    equipo=models.CharField(max_length=50)
    nombre_equipo=models.CharField(max_length=50)
    lid=models.BooleanField()
    gre=models.BooleanField()
    jor=models.BooleanField()
    giro=models.BooleanField()
    tour=models.BooleanField()
    vuelta=models.BooleanField()
    abandono_giro=models.IntegerField(default=0)
    etapa_aban_giro=models.IntegerField(default=0)
    abandono_tour=models.IntegerField(default=0)
    etapa_aban_tour=models.IntegerField(default=0)
    abandono_vuelta=models.IntegerField(default=0)
    etapa_aban_vuelta=models.IntegerField(default=0)

    class Meta:
        ordering=['nombre']

    def __str__(self):
        return self.nombre

class Equipo (models.Model):
    alias=models.CharField(max_length=50,primary_key=True)
    lid1=models.ForeignKey(Corredor,limit_choices_to={'lid':True,'giro':True,'tipo': "Rider"},related_name="lid1",on_delete=models.CASCADE)
    lid2=models.ForeignKey(Corredor,related_name="lid2",on_delete=models.CASCADE)
    lid3=models.ForeignKey(Corredor,related_name="lid3",on_delete=models.CASCADE)
    lid4=models.ForeignKey(Corredor,related_name="lid4",on_delete=models.CASCADE)
    gre1=models.ForeignKey(Corredor,limit_choices_to={'gre':True,related_name="gre1",on_delete=models.CASCADE)
    gre2=models.ForeignKey(Corredor,related_name="gre2",on_delete=models.CASCADE)
    gre3=models.ForeignKey(Corredor,related_name="gre3",on_delete=models.CASCADE)
    jlg1=models.ForeignKey(Corredor,limit_choices_to={'jor':True,related_name="jlg1",on_delete=models.CASCADE)
    jlg2=models.ForeignKey(Corredor,related_name="jlg2",on_delete=models.CASCADE)
    lid_sup=models.ForeignKey(Corredor,related_name="lid_sup",on_delete=models.CASCADE)
    gre_sup=models.ForeignKey(Corredor,related_name="gre_sup",on_delete=models.CASCADE)
    jlg_sup=models.ForeignKey(Corredor,related_name="jlg_sup",on_delete=models.CASCADE)
    ganador_e1=models.ForeignKey(Corredor,limit_choices_to={'giro':True,related_name="ganador_e1",on_delete=models.CASCADE)
    ganador_e2=models.ForeignKey(Corredor,related_name="ganador_e2",on_delete=models.CASCADE)
    ganador_e3=models.ForeignKey(Corredor,related_name="ganador_e3",on_delete=models.CASCADE)
    ganador_e4=models.ForeignKey(Corredor,related_name="ganador_e4",on_delete=models.CASCADE)
    ganador_e5=models.ForeignKey(Corredor,related_name="ganador_e5",on_delete=models.CASCADE)
    ganador_e6=models.ForeignKey(Corredor,related_name="ganador_e6",on_delete=models.CASCADE)
    ganador_e7=models.ForeignKey(Corredor,related_name="ganador_e7",on_delete=models.CASCADE)
    ganador_e8=models.ForeignKey(Corredor,related_name="ganador_e8",on_delete=models.CASCADE)
    ganador_e9=models.ForeignKey(Corredor,related_name="ganador_e9",on_delete=models.CASCADE)
    ganador_e10=models.ForeignKey(Corredor,related_name="ganador_e10",on_delete=models.CASCADE)
    ganador_e11=models.ForeignKey(Corredor,related_name="ganador_e11",on_delete=models.CASCADE)
    ganador_e12=models.ForeignKey(Corredor,related_name="ganador_e12",on_delete=models.CASCADE)
    ganador_e13=models.ForeignKey(Corredor,related_name="ganador_e13",on_delete=models.CASCADE)
    ganador_e14=models.ForeignKey(Corredor,related_name="ganador_e14",on_delete=models.CASCADE)
    ganador_e15=models.ForeignKey(Corredor,related_name="ganador_e15",on_delete=models.CASCADE)
    ganador_e16=models.ForeignKey(Corredor,related_name="ganador_e16",on_delete=models.CASCADE)
    ganador_e17=models.ForeignKey(Corredor,related_name="ganador_e17",on_delete=models.CASCADE)
    ganador_e18=models.ForeignKey(Corredor,related_name="ganador_e18",on_delete=models.CASCADE)
    ganador_e19=models.ForeignKey(Corredor,related_name="ganador_e19",on_delete=models.CASCADE)
    ganador_e20=models.ForeignKey(Corredor,related_name="ganador_e20",on_delete=models.CASCADE)
    ganador_e21=models.ForeignKey(Corredor,related_name="ganador_e21",on_delete=models.CASCADE)
    ganador_tour=models.ForeignKey(Corredor,related_name="maillot_amarillo",on_delete=models.CASCADE)
    segundo_tour=models.ForeignKey(Corredor,related_name="segundo",on_delete=models.CASCADE)
    tercero_tour=models.ForeignKey(Corredor,related_name="tercero",on_delete=models.CASCADE)
    cuarto_tour=models.ForeignKey(Corredor,related_name="cuarto",on_delete=models.CASCADE)
    quinto_tour=models.ForeignKey(Corredor,related_name="quinto",on_delete=models.CASCADE)
    sexto_tour=models.ForeignKey(Corredor,related_name="sexto",on_delete=models.CASCADE)
    mv=models.ForeignKey(Corredor,related_name="maillot_verde",on_delete=models.CASCADE)
    mpr=models.ForeignKey(Corredor,related_name="maillot_puntos_rojos",on_delete=models.CASCADE)
    mb=models.ForeignKey(Corredor,'nacimiento__gte': 1996},related_name="maillot_blanco",on_delete=models.CASCADE)
    sc=models.ForeignKey(Corredor,related_name="supercombativo",on_delete=models.CASCADE)
    me=models.ForeignKey(Corredor,'tipo': "Team"},related_name="mejor_equipo",on_delete=models.CASCADE)
    owner=models.ForeignKey(User,on_delete=models.CASCADE)
    created=models.DateTimeField(auto_Now_add=True)

    def __str__(self):
        return self.alias

class Puntuacion (models.Model):
    competicion=models.CharField(max_length=50)
    temporada=models.IntegerField()
    etapa=models.IntegerField()
    modalidad=models.CharField(max_length=50)
    dorsal=models.ForeignKey(Corredor,blank=True,null=True,related_name="puntos",on_delete=models.CASCADE)
    categoria=models.CharField(max_length=50)
    descripcion=models.CharField(max_length=150)
    puntos=models.IntegerField()

    def __str__(self):
        return self.categoria

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)