Django:使用整数设置外键?

u59ebvdq  于 2023-03-04  发布在  Go
关注(0)|答案(3)|浏览(101)

有没有一种方法可以使用模型的整数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对象。

iq3niunx

iq3niunx1#

没错

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

ForeignKey字段将它们的值存储在一个末尾带有_id的属性中,您可以直接访问该属性以避免访问数据库。
ForeignKey_id版本是Django的一个特别有用的方面,每个人都应该知道并在适当的时候不时使用。

警告:[〈Django 2.1 ]

@RuneKaagaard指出employee.type在最近的Django版本中是不准确的,即使在调用了employee.save()之后(它保持了它的旧值)。使用它当然会使上述优化的目的落空,但我更希望意外的额外查询是不正确的。所以要小心,只有当你完成了你的示例(例如employee)时才使用它。

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

2q5ifsrm

2q5ifsrm2#

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

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

s4n0splo3#

只是为了强调一些关于公认答案的东西(基于我的经验):当您希望在外键的"id"字段中添加一个值时(希望这是明确的),您必须在您在该类中定义的名称的末尾添加"_id"。
在本例中:employee =员工(名字="姓名",姓氏="姓名",类型**_id**= 4)
这里的"type"是指"Employee"类中定义的"type"。
请注意,如果您已经定义了类似"foo_id"的内容,您仍然必须添加"_id"后缀,结果将是"foo_id_id"
PS:我无法评论或做其他操作(没有足够的信誉点)

相关问题