【问题标题】:Django: Set foreign key using integer?Django:使用整数设置外键?
【发布时间】:2011-02-20 05:19:16
【问题描述】:

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

【问题讨论】:

    标签: django optimization django-models foreign-keys


    【解决方案1】:

    是的:

    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 中修复。
    【解决方案2】:

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

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

    【讨论】:

    • 这会调用构造函数吗?
    猜你喜欢
    • 2010-09-26
    • 2018-08-17
    • 2019-11-17
    • 2012-04-28
    • 2016-02-06
    • 2016-05-21
    • 2017-08-16
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多