【问题标题】:Is there any way to make this filter query smaller有没有办法让这个过滤器查询更小
【发布时间】:2022-01-18 22:30:48
【问题描述】:

这些是我的桌子:

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() 应该对此有所帮助,但它遵循外键并返回所有结果而不是与此 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)

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

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 是罪魁祸首,我不明白为什么,也不知道如何解决这个问题,搜索了很多,也浏览了很多文档。

【问题讨论】:

  • 其实你不需要Employee_Job模型,而是设置一个ForeignKeykey表单Employee为Job,这样你也可以简化查询。
  • @Sumithran:这可能发生在您创建对象时,因为那时还没有Salary对象。我强烈建议不要.save() 方法中使用它:将其存储为数据不是一个好主意,例如,如果Employee 更改其名称,它将不会更新。通过使用属性,您拥有单一事实来源
  • @WillemVanOnsem 是的,我的错,我明白你的意思。

标签: python django django-models django-views django-forms


【解决方案1】:

是的,您可以使用过滤器

@property
def name(self):
    Employee.objects.get(
        employee_job__salary=self
    ).name

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


注意:Django 中的模型是用 PascalCase 编写的,而不是 snake_case, 所以您可能想将模型从 Employee_Job 重命名为 EmployeeJob

【讨论】:

  • 您好!请您看一下更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2021-03-02
  • 2011-03-04
  • 2013-11-15
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多