Django:使用整数设置外键?

Use*_*ser 95 django optimization foreign-keys django-models

有没有办法使用模型的整数id设置外键关系?这将用于优化目的.

例如,假设我有一个Employee模型:

class Employee(models.Model):
  first_name = models.CharField(max_length=100)
  last_name = models.CharField(max_length=100)
  type = models.ForeignKey('EmployeeType')
Run Code Online (Sandbox Code Playgroud)

EmployeeType(models.Model):
  type = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*rdy 195

是的:

employee = Employee(first_name="Name", last_name="Name")
employee.type_id = 4
employee.save()
Run Code Online (Sandbox Code Playgroud)

ForeignKeyfields将其值存储_id在末尾的属性中,您可以直接访问该属性以避免访问数据库.

a的_id版本ForeignKey是Django的一个特别有用的方面,每个人都应该在适当的时候知道和使用它.

警告:

@RuneKaagaard指出,employee.type在最近的Django版本中,即使在调用之后employee.save()(它保持其旧值)也不准确.使用它当然会破坏上述优化的目的,但我更希望一个偶然的额外查询不正确.所以要小心,只有在完成对实例的处理时才使用它(例如employee).

  • 这记录了吗? (9认同)
  • 直接使用外键值:https://docs.djangoproject.com/en/1.8/topics/db/optimization/#use-foreign-key-values-directly (6认同)
  • 对于将来来到这里的任何人,这个问题已在 [Django 2.1](https://github.com/django/django/commit/ee49306176a2d2f1751cb890bd607d42c7c09196) 中修复。 (5认同)
  • @AmichaiSchreiber我相信Django的下一个版本将解决这个问题:https://code.djangoproject.com/ticket/27710 (3认同)

Jac*_*nda 39

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

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)
Run Code Online (Sandbox Code Playgroud)