用整数设置外键?

是否有一种使用模型的整数 id 来设置外键关系的方法?这将用于优化目的。

例如,假设我有一个 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)

我希望拥有无限的员工类型的灵活性,但是在已部署的应用程序中可能只有一种类型,所以我想知道是否有一种方法可以硬编码 id 并以这种方式设置关系。通过这种方式,我可以避免首先调用 db 来获取 EmployeeType 对象。

64889 次浏览

是的:

employee = Employee(first_name="Name", last_name="Name")
employee.type_id = 4
employee.save()

ForeignKey字段将它们的值存储在一个属性中,该属性的末尾是 _id,您可以直接访问该属性以避免访问数据库。

ForeignKey_id版本是 Django 的一个特别有用的方面,每个人都应该知道并在适当的时候不时地使用它。

警告: [ < Django 2.1]

@ RuneKaagaard 指出,在最近的 Django 版本中,即使在调用了 employee.save()(它保存了旧值)之后,employee.type也不准确。使用它当然会破坏上述优化的目的,但我宁愿意意外的额外查询是不正确的。所以要小心,只有在完成实例工作时才使用它(例如 employee)。

注意 : 正如@humcat 在下面指出的,这个 bug 在 Django 2.1中修复了

使用 创造创建对象并将其保存到数据库的一种替代方法:

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