Имена классов моделей должны быть единственными.Это будет читать намного лучше в Python.Вы можете присвоить ассоциированной таблице базы данных другое имя, используя class Meta:
внутри класса модели.Кроме того, Менеджер по умолчанию objects
, а не object
.
Вам не нужно проходить через все эти проблемы.Django позаботится о сопоставлении идентификаторов.Создает «обратное» поле в целевой модели 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', ...)
(пробелы вокруг =
не используются при использовании в списках параметров.) Обратите внимание, что вам не нужно устанавливать идентификатор сотрудника таким образом.
Тем не менее, большинство из нас предоставляют 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
для использования позже.