2011-09-21 231 views
0

我对编程和数据库非常陌生,我对django中的外键有疑问。django模型外键问题

假设我有一个叫Expenses的模型,它有一个指向Employees模型的外键。

class Employees(models.Model): 
    ... 

class Expenses(models.Model): 
    ... 
    employee = models.ForeignKey(Employees) 

我看到foreignkey字段是一个员工ID。

所以我的问题是,如果在实践中我有一个访问我employee's name一个形式,我会:

  1. Employees表得到employee id名称为
  2. 插入employee id为外键的费用表所示:

    EMP_ID = Employees.object.get(NAME = '李四')

    new_expense =支出(富= '酒吧',...,EMPLOYEE_ID = emp_id.employee_id) new_expenses.save()

我这样做对吗?如果是的话,这是做到这一点的正确方法?

回答

2

模型类名称应该是单数。这在Python中会读得更好。通过在模型类中使用class Meta:,可以使关联的数据库表具有不同的名称。此外,默认管理器是objects,而不是object

你不需要经历所有的麻烦。 Django将负责映射ID。它在ForeignKey的目标模型中创建一个“反向”字段。此反向连接的名称是带有ForeignKey加_set的模型的名称。所以,在你的情况下,Employees将有一个名为expenses_set的自动生成的字段,它作为一个经理包含所有该员工的开支。经理也有方法,如createdelete。所以,你的例子就是:

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对象供以后使用。

+0

很好的回答,谢谢。我回家后会试试看。 – zentenk