Django: установить внешний ключ с помощью целого числа?
Есть ли способ установить отношение внешнего ключа, используя целочисленный идентификатор модели? Это было бы для целей оптимизации.
Например, предположим, что у меня есть модель 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.
Ответы
Ответ 1
Да:
employee = Employee(first_name="Name", last_name="Name")
employee.type_id = 4
employee.save()
Поля ForeignKey
сохраняют свое значение в атрибуте с _id
в конце, к которому вы можете получить доступ напрямую, чтобы не посещать базу данных.
Версия _id
ForeignKey
является особенно полезным аспектом Django, который каждый должен знать и использовать время от времени, когда это необходимо.
предостережение:
@RuneKaagaard указывает, что employee.type
не является точной впоследствии в последних версиях Django, даже после вызова employee.save()
(он сохраняет свое старое значение). Использование этого, конечно же, приведет к победе в цели вышеупомянутой оптимизации, но я предпочел бы, чтобы случайный дополнительный запрос был неправильным. Поэтому будьте осторожны, используйте это только когда вы закончите работу над своим экземпляром (например, employee
).
Ответ 2
Альтернатива, которая использует create, чтобы создать объект и сохранить его в базе данных в одном строка:
employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)