django模型外国人的问题

时间:2011-09-21 05:49:54

标签: python django model-view-controller

我是编程和数据库的新手,我对django中的外键有疑问。

假设我有一个名为Expenses的模型,其外键指向Employees模型。

class Employees(models.Model):
    ...

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

我看到foreignkey字段是员工ID。

所以我的问题是,如果在实践中我在表格上可以访问employee's name,我将不得不:

  1. employee id表中获取名称为
  2. Employees
  3. employee id作为外键插入费用表,如下所示:

    emp_id = Employees.object.get(name ='John Doe')

    new_expense =费用(foo ='bar',...,employee_id = emp_id.employee_id,) new_expenses.save()

  4. 我这样做了吗?如果是这样,这是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

模型类名称应该是单数。这将在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。

尽管如此,我们大多数人都使用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对象以供稍后使用。