模型类名称应该是单数。这在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。
这就是说,我们大多数人使用related_name
参数反向链路提供ForeignKey
有一个更好的名字:
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
对象供以后使用。
很好的回答,谢谢。我回家后会试试看。 – zentenk