有没有办法让这个过滤器查询更小

Is there any way to make this filter query smaller

这些是我的表格:

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

这个查询对我来说似乎很长,我认为 select_related() 应该对此有所帮助,但它遵循外键并且 return 所有结果不是与 THIS Salary 实例相关的结果。

跟进 Willem Van Onsem 的回答:

我在我的表中添加了更多的行,并且我在 save() 函数中使用了这个查询,突然我收到了这个错误:

get() returned more than one 这是一个常见的错误。

我也将查询缩小了一点:

def save(self, *args, **kwargs):
    self.full_name = Employee_Job.objects.get(
        salary=self
    ).name + " 's salary"
super(salary, self).save(*args, **kwargs)

我查看了 SQL 查询 Django 是什么 运行 在幕后,我找到了罪魁祸首:

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

我认为 WHERE [blog_salary].[id] IS NULL 是罪魁祸首,我不明白为什么,我也不知道如何解决这个问题,搜索了很多,也浏览了很多文档。

是的,您可以使用

进行过滤
@property
def name(self):
    Employee.objects.get(
        <strong>employee_job__salary=self</strong>
    ).name

这将检索具有 Employee_Job 且与 self 相关的员工作为薪水。


Note: Models in Django are written in PascalCase, not snake_case, so you might want to rename the model from Employee_Job to EmployeeJob.