Джанго: Установить внешний ключ, используя целое число? - PullRequest
90 голосов
/ 17 мая 2010

Есть ли способ установить отношение внешнего ключа, используя целочисленный идентификатор модели? Это было бы для целей оптимизации.

Например, предположим, у меня есть модель Employee:

class Employee(models.Model):
  first_name = models.CharField(max_length=100)
  last_name = models.CharField(max_length=100)
  type = models.ForeignKey('EmployeeType')

и

EmployeeType(models.Model):
  type = models.CharField(max_length=100)

Мне нужна гибкость неограниченного количества типов сотрудников, но в развернутом приложении, скорее всего, будет только один тип, поэтому мне интересно, есть ли способ жестко кодировать идентификатор и устанавливать отношения таким образом. Таким образом, я могу избежать вызова db, чтобы сначала получить объект EmployeeType.

Ответы [ 2 ]

187 голосов
/ 17 мая 2010

Yep:

employee = Employee(first_name="Name", last_name="Name")
employee.type_id = 4
employee.save()
Поля

ForeignKey хранят свое значение в атрибуте с _id в конце, к которому вы можете обращаться напрямую, чтобы избежать посещения базы данных.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ForeignKey версия *1009* является особенно полезным аспектом Джанго;

нюанс:

@ RuneKaagaard указывает, что employee.type впоследствии не является точным в последних версиях Django, даже после вызова employee.save() (он сохраняет свое старое значение). Его использование, конечно же, лишило бы смысла вышеуказанную оптимизацию, но я бы предпочел, чтобы случайный дополнительный запрос был неверным. Так что будьте осторожны, используйте это только когда вы закончите работу над своим экземпляром (например, employee).

37 голосов
/ 21 мая 2013

Альтернатива, которая использует create для создания объекта и сохранения его в базе данных в одну строку:

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)
...