Perform queryset between 3 models

1

I have 3 models: Student, Characterization and semester

I need to obtain a queryset with the semesters that NO have been registered in the characterizations of each student.

I mean, each student can have a number of characterizations and the characterizations have a semester (foreigner) and a student (foreigner) but a student can not have more than two characterizations with the same semester.

these are my models

Student

class Estudiante(models.Model):

    nombre = models.CharField(verbose_name="Nombres", max_length=200)
    apellido = models.CharField(verbose_name="Apellidos", max_length=200)
    tipo_documento = models.IntegerField(choices=TIPOS_DOCUMENTOS, default=1)
    documento = models.CharField(
        verbose_name="Número de documento", max_length=200, unique=True)
    celular = models.CharField(
        verbose_name="Celular", max_length=200, null=True, blank=True)
    telefono = models.CharField(
        verbose_name="Telefono", max_length=200, null=True, blank=True)
    genero = models.ForeignKey(
        Genero, verbose_name="Género", on_delete=models.CASCADE)
    fecha_nacimiento = models.DateField(verbose_name="Fecha de nacimiento")
    email = models.EmailField(
        verbose_name="Correo electronico", null=True, blank=True, unique=True)
    direccion = models.CharField(
        verbose_name="Dirección", max_length=200, null=True, blank=True)
    foto = models.ImageField(upload_to=custom_upload_to, null=True, blank=True)
    programa = models.ForeignKey(Programa, on_delete=models.CASCADE)
    estado = models.IntegerField(choices=ESTADOS, default=0)
    semestre_inicio = models.ForeignKey(Semestre, on_delete=models.CASCADE)

    def __str__(self):
        return ('{} {}'.format(self.nombre, self.apellido))

Semester

class Semestre(models.Model):
    nombre = models.CharField(verbose_name="Nombre", max_length=200, unique=True)

    def __str__(self):
        return self.nombre

Characterization

class Caracterizacion(models.Model):
    SI_NO = (
        (1,'Sí'),
        (2,'No'),
    )
    estudiante = models.ForeignKey(Estudiante, verbose_name="Estudiante", on_delete=models.CASCADE)
    descripcion = models.TextField(verbose_name="Descripción", null=True, blank=True)
    semestre = models.ForeignKey(Semestre, verbose_name="Semestre", on_delete=models.CASCADE)
    tipo = models.ForeignKey(Tipo_caracterizacion, verbose_name="Tipo", on_delete=models.CASCADE, default=1)
    nivelado = models.IntegerField(choices = SI_NO, default=1)
    usuario = models.ForeignKey(User, verbose_name="Usuario", on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True, verbose_name="Fecha de creación")

    def __str__(self):
        return ('{} - {}'.format(self.estudiante, self.semestre))
    
asked by Cesar Martinez Quiroga 10.10.2018 в 00:43
source

1 answer

0

I do not know if I understood it correctly, but it could be something like this:

Semestre.objects.exclude(pk__in=Caracterizacion.objects.all().values('semestre__pk'))

The idea is to extract the total of existing characterizations, from there take the semesters that have characterization through values , and use this set to exclude them from the total of Semesters.

    
answered by 10.10.2018 в 10:24