有没有办法让这个过滤器查询更小
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
.
这些是我的表格:
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
toEmployee_Job
EmployeeJob
.