我是编程和数据库的新手,我对django中的外键有疑问。
假设我有一个名为Expenses
的模型,其外键指向Employees
模型。
class Employees(models.Model):
...
class Expenses(models.Model):
...
employee = models.ForeignKey(Employees)
我看到foreignkey字段是员工ID。
所以我的问题是,如果在实践中我在表格上可以访问employee's name
,我将不得不:
employee id
表中获取名称为Employees
将employee id
作为外键插入费用表,如下所示:
emp_id = Employees.object.get(name ='John Doe')
new_expense =费用(foo ='bar',...,employee_id = emp_id.employee_id,) new_expenses.save()
我这样做了吗?如果是这样,这是正确的方法吗?
答案 0 :(得分:3)
模型类名称应该是单数。这将在Python中读得更好。通过在模型类中使用class Meta:
,可以使关联的数据库表具有不同的名称。此外,默认管理器为objects
,而非object
。
你不需要经历所有麻烦。 Django将负责映射ID。它在ForeignKey
的目标模型中创建“反向”字段。此反向连接的名称是具有ForeignKey加_set
的模型的名称。因此,在您的情况下,Employees
将有一个名为expenses_set
的自动生成字段,该字段充当管理员,包含该员工的所有费用。经理也有create
和delete
等方法。所以你的例子就是:
new_expense = (Employee.objects.get(name='John Doe')
.expense_set.create(foo='bar', ...))
虽然最好密切关注Employee
对象:
employee = Employee.objects.get(name='John Doe')
new_expense = employee.expense_set.create(foo='bar', ...)
(在参数列表中使用时,=
周围没有空格。)请注意,您不需要以这种方式设置员工ID。
尽管如此,我们大多数人都使用ForeignKey
参数为related_name
提供了更好的反向链接名称:
class Expenses(models.Model):
...
employee = models.ForeignKey(Employees, related_name='expenses')
...
employee = Employee.objects.get(name='John Doe')
new_expense = employee.expenses.create(foo='bar', ...)
顺便说一句,如果你想获得员工的开支,有三种方法。一个是如上所述:
employee = Employee.objects.get(name='John Doe')
employee_expenses = employee.expenses.all()
或者单行:
employee_expenses = Employee.objects.get(name='John Doe').expenses.all()
还有:
employee_expenses = Expense.objects.filter(employee__name="John Doe")
__
说取消引用ForeignKey到达其字段。第一种方法执行两个查询,其他查询执行一个查询,但是您没有获得中间Employee
对象以供稍后使用。