Django Модель Вопрос с иностранными ключами - PullRequest
0 голосов
/ 21 сентября 2011

Я очень плохо знаком с программированием и базами данных, и у меня есть вопрос об иностранных ключах в django.

Скажем, у меня есть модель с именем Expenses, в которой иностранный ключ указывает на Employees модель.

class Employees(models.Model):
    ...

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

Я вижу, что поле foreignkey является идентификатором сотрудника.

Поэтому мой вопрос: если на практике у меня есть employee's name, доступный для меня в форме, мне нужно будет:

  1. получить employee id из таблицы Employees с именем
  2. Вставить employee id в качестве внешнего ключа в таблицу расходов следующим образом:

    emp_id = Employees.object.get (name = 'Джон Доу')

    new_expense = Расходы (foo = 'bar', ..., employee_id = emp_id.employee_id,) new_expenses.save ()

Я правильно делаю?Если так, то это правильный способ сделать это?

1 Ответ

3 голосов
/ 21 сентября 2011

Имена классов моделей должны быть единственными.Это будет читать намного лучше в 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 для использования позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...