0

I've got three models like this:

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,limit_choices_to={'lid':True, 'giro':True, 'tipo': "Rider"}, related_name="lid2", on_delete=models.CASCADE)
    lid3=models.ForeignKey(Corredor,limit_choices_to={'lid':True, 'giro':True, 'tipo': "Rider"}, related_name="lid3", on_delete=models.CASCADE)
    lid4=models.ForeignKey(Corredor,limit_choices_to={'lid':True, 'giro':True, 'tipo': "Rider"}, related_name="lid4", on_delete=models.CASCADE)
    gre1=models.ForeignKey(Corredor,limit_choices_to={'gre':True, 'giro':True, 'tipo': "Rider"}, related_name="gre1", on_delete=models.CASCADE)
    gre2=models.ForeignKey(Corredor,limit_choices_to={'gre':True, 'giro':True, 'tipo': "Rider"}, related_name="gre2", on_delete=models.CASCADE)
    gre3=models.ForeignKey(Corredor,limit_choices_to={'gre':True, 'giro':True, 'tipo': "Rider"}, related_name="gre3", on_delete=models.CASCADE)
    jlg1=models.ForeignKey(Corredor,limit_choices_to={'jor':True, 'giro':True, 'tipo': "Rider"}, related_name="jlg1", on_delete=models.CASCADE)
    jlg2=models.ForeignKey(Corredor,limit_choices_to={'jor':True, 'giro':True, 'tipo': "Rider"}, related_name="jlg2", on_delete=models.CASCADE)
    lid_sup=models.ForeignKey(Corredor,limit_choices_to={'lid':True, 'giro':True, 'tipo': "Rider"}, related_name="lid_sup", on_delete=models.CASCADE)
    gre_sup=models.ForeignKey(Corredor,limit_choices_to={'gre':True, 'giro':True, 'tipo': "Rider"}, related_name="gre_sup", on_delete=models.CASCADE)
    jlg_sup=models.ForeignKey(Corredor,limit_choices_to={'jor':True, 'giro':True, 'tipo': "Rider"}, related_name="jlg_sup", on_delete=models.CASCADE)
    ganador_e1=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e1", on_delete=models.CASCADE)
    ganador_e2=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e2", on_delete=models.CASCADE)
    ganador_e3=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e3", on_delete=models.CASCADE)
    ganador_e4=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e4", on_delete=models.CASCADE)
    ganador_e5=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e5", on_delete=models.CASCADE)
    ganador_e6=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e6", on_delete=models.CASCADE)
    ganador_e7=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e7", on_delete=models.CASCADE)
    ganador_e8=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e8", on_delete=models.CASCADE)
    ganador_e9=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e9", on_delete=models.CASCADE)
    ganador_e10=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e10", on_delete=models.CASCADE)
    ganador_e11=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e11", on_delete=models.CASCADE)
    ganador_e12=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e12", on_delete=models.CASCADE)
    ganador_e13=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e13", on_delete=models.CASCADE)
    ganador_e14=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e14", on_delete=models.CASCADE)
    ganador_e15=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e15", on_delete=models.CASCADE)
    ganador_e16=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e16", on_delete=models.CASCADE)
    ganador_e17=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e17", on_delete=models.CASCADE)
    ganador_e18=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e18", on_delete=models.CASCADE)
    ganador_e19=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e19", on_delete=models.CASCADE)
    ganador_e20=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e20", on_delete=models.CASCADE)
    ganador_e21=models.ForeignKey(Corredor, limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="ganador_e21", on_delete=models.CASCADE)
    ganador_tour=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="maillot_amarillo", on_delete=models.CASCADE)
    segundo_tour=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="segundo", on_delete=models.CASCADE)
    tercero_tour=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="tercero", on_delete=models.CASCADE)
    cuarto_tour=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="cuarto", on_delete=models.CASCADE)
    quinto_tour=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="quinto", on_delete=models.CASCADE)
    sexto_tour=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="sexto", on_delete=models.CASCADE)
    mv=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="maillot_verde", on_delete=models.CASCADE)
    mpr=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="maillot_puntos_rojos", on_delete=models.CASCADE)
    mb=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'nacimiento__gte': 1996}, related_name="maillot_blanco", on_delete=models.CASCADE)
    sc=models.ForeignKey(Corredor,limit_choices_to={'giro':True, 'tipo': "Rider"}, related_name="supercombativo", on_delete=models.CASCADE)
    me=models.ForeignKey(Corredor,limit_choices_to={'giro':True, '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

In Puntuacion a dorsal can have puntos in different categorias or maybe not to have any puntos. The objective is, in the model Equipo, for every Alias to have the total Sum of puntos acumulated by all the dorsal who are in the different fields (lid1, lid2, lid2,........gre1,gre2,.....).

I'm new in django and I think the use of annotate is the option, but I don´t know exactly how to do the query.

Thank you anyone who can help me.

Antonio
  • 11
  • 3
  • Instead of having so many Foreign Keys to the same table why don't you use a `ManyToManyField`? – Abdul Aziz Barkat Mar 09 '21 at 16:03
  • You have to choose 4 leaders from a group of Corredores, 3 gregarios from another group and 2 jornaleros from another group. In addition you have to choose for the rest of fields a corredor that can be repeated a lot of times. I thought that for queries is better ForeignKeys than Manytomany looking for simply queries. – Antonio Mar 09 '21 at 17:50

0 Answers0