【问题标题】:How to get the ID of a just created record in Django?如何在 Django 中获取刚刚创建的记录的 ID?
【发布时间】:2011-09-09 08:43:44
【问题描述】:

我的一个项目使用 Django 1.3,我需要获取刚刚保存在数据库中的记录的 ID。

我有类似下面的代码在数据库中保存记录:

n = MyData.objects.create(record_title=title, record_content=content)
n.save()

刚刚保存自动增量的记录的ID。有没有办法获取该 ID 并在我的代码中的其他地方使用它?

【问题讨论】:

  • 这里不需要n.save()这一行,因为MyData.objects.create会自动保存新实例。
  • 我的回答 stackoverflow.com/a/25807622/3762142 会让你在 html 页面中获得 id..

标签: django django-models


【解决方案1】:

保存后使用n.id。

见“Auto-incrementing primary keys”。

【讨论】:

  • 当我在视图中使用表单保存数据时,如何访问仅由 froms 对象保存的 id?
  • 它应该是n.pk,因为只有当你没有自己添加主键,或者添加一个并命名为id时,它才会是id。
  • @JamesO 如何获取或解析这个 id 作为模型实例。
【解决方案2】:

应该是n.pk。

引用“Model.pk”:

无论您是否定义了 自己的主键字段,或者让 Django 为您提供一个,每个模型 将有一个名为 pk 的属性。它 表现得像一个正常的属性 模型,但实际上是 哪个属性是主键 模型的字段。你可以阅读和 设置这个值,就像你想要的一样 任何其他属性,它会 更新模型中的正确字段。

【讨论】:

  • 不错的发现。这表明调用 .pk 可能被认为是“最佳实践”,因为它引用了默认 ID 或自定义 ID。
  • 上面的链接指向 django 的开发版本。 v 1.7-v1.10 说了同样的话,不过:docs.djangoproject.com/en/1.10/ref/models/instances/… 在 v1.7 之前不确定
【解决方案3】:

ID 将在您的模型中自动更新,因此在您的 n.save() 行之后,您可以立即读取 n.id 并将其填充。

【讨论】:

【解决方案4】:

去掉save(),直接获取pk:

n = MyData.objects.create(record_title=title, record_content=content)
n.pk

【讨论】:

    【解决方案5】:

    如果有人阅读此问题并在检查其他答案后仍然在创建对象后访问 id 时遇到问题。 确保您没有在模型中将 id 定义为整数。如果您决定声明它,请使用 Autofield 但您不需要,它是免费的 models.Model

    #No
    class TestModel(models.Model):
        id = models.IntegerField(primary_key=True)
        something...
    
    
    #Ok
    class TestModel(models.Model):
        id = models.AutoField(primary_key=True)
        something...
    
    #Ok
    class TestModel(models.Model):
        something...
    

    如果您将id 定义为整数,则TestModel.objects.create( 或save() 将返回None。

    【讨论】:

      【解决方案6】:

      我在访问 id 时遇到了类似的问题。在 Django 3.0.5 中,这就是我访问 id 的方式。使用您的示例和变量名称,请参见下文:

      instance = n.save()
      # return the id
      instance[0].id 
      

      上面的变量“实例”是一个列表。在上述方法中访问 id 会在 Django 3 中返回一个 AttributeError(“对象没有属性 'id'”)。

      此答案适用于使用modelformset_factory。从 Django docs 中描述的 Django 模型创建 Form 类时确实如此。

      【讨论】:

      • 它不工作,它得到一个错误,对象类型不可下标
      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2017-07-04
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多