Django:使用整数设置外键?


104

有没有一种方法可以使用模型的整数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进行硬编码并以此方式设置关系。这样,我可以避免通过数据库调用先获取EmployeeType对象。

Answers:


205

是的:

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)使用此功能。


10
有记录吗?
斯科特·斯塔福德


1
我今天在Django 1.7上进行了测试,这不是一个好主意。当它起作用时,该type字段将被写入数据库,但是,如果type以后访问该属性,它不会反映出更改。用代码说,这将失败assert(employe.type.id == 4)
符文卡加德

3
@AmichaiSchreiber我相信Django的下一版本将解决此问题:code.djangoproject.com/ticket/27710
Will Hardy

2
对于以后再来的人,此问题已在Django 2.1中修复。
humcat

45

使用create创建对象并将其保存到一行中的另一种替代方法:

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.