Estas son mis tablas:
class Employee(models.Model): name = models.CharField() class Job(models.Model): title = models.CharField() class Employee_Job(models.Model): employee_f = models.ForeignKey(Employee, on_delete=models.CASCADE) job_f = models.ForeignKey(Job, on_delete=models.CASCADE) class Salary(models.Model): employee_job_f = models.ForeignKey(Employee_Job, on_delete=models.CASCADE) full_name = models.CharField() @property def name(self): return Employee.objects.filter(id = ( Employee_Job.objects.filter(id = self.employee_job_f_id ).first().employee_f )).first().name Esta consulta me parece muy larga, pensé que select_related() debería ayudar con esto, pero sigue claves externas y devuelve TODOS los resultados, no el resultado que está relacionado con ESTA instancia de Salario.
Seguimiento de la respuesta de Willem Van Onsem:
Agregué un par de filas más a mis tablas y estoy usando esta consulta en la función guardar () y de repente recibo este error:
get() returned more than one , lo cual es un error popular.
También hice la consulta un poco más pequeña:
def save(self, *args, **kwargs): self.full_name = Employee_Job.objects.get( salary=self ).name + " 's salary" super(salary, self).save(*args, **kwargs)Revisé para ver qué consulta SQL está ejecutando Django detrás de escena y encontré al culpable:
SELECT [blog_employee_job].[id], [blog_employee_job].[employee_f_id], [blog_employee_job].[job_f_id] FROM [blog_employee_job] LEFT OUTER JOIN [blog_salary] ON ([blog_employee_job].[id] = [blog_salary].[employee_job_f_id]) WHERE [blog_salary].[id] IS NULL Creo que WHERE [blog_salary].[id] IS NULL es el culpable y no entiendo por qué y no sé cómo arreglar esto, busqué mucho y revisé mucho Docs también.
Sí, puedes filtrar con
@property def name(self): Employee.objects.get( employee_job__salary=self ).name Esto recuperará al empleado que tiene un Employee_Job que está relacionado con self como salario.
Nota : los modelos en Django están escritos en PascalCase , no en snake_case , por lo que es posible que desee cambiar el nombre del modelo de
aEmployee_JobEmployeeJob.