ChatGPT解决这个技术问题 Extra ChatGPT

Django:使用整数设置外键?

有没有办法使用模型的整数 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 对象的 db 调用。


s
sm7

是的:

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

ForeignKey 字段将其值存储在以 _id 结尾的属性中,您可以直接访问该属性以避免访问数据库。

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

警告:[

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

注意:正如@humcat 在下面指出的,该错误已在 Django 2.1 中修复


我今天在 Django 1.7 上测试了这个,这不是一个好主意。虽然它有效,并且 type 字段被写入数据库,但如果您之后访问 type 属性,它不会反映更改。用代码表示,这将失败 assert(employe.type.id == 4)
@WillHardy 没错,今天在 FK 字段中记录更改时被咬了。我认为 Django 意味着 _id 快捷方式是只读的,至少应该这样记录。
@AmichaiSchreiber 我相信下一个版本的 Django 会解决这个问题:code.djangoproject.com/ticket/27710
对于将来来到这里的任何人,此问题已在 Django 2.1 中得到解决。
J
Jacinda

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

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

这会调用构造函数吗?