【发布时间】: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