【问题标题】:Can I make Django return the ID for a record on create?我可以让 Django 返回创建记录的 ID 吗?
【发布时间】:2013-11-01 00:07:20
【问题描述】:

我正在使用 object.create 将记录存储到 django 数据库:

     result = MyObject.objects.create(var1='foo',
                                      var2='bar',
                                         ...
                                     )

在执行之后result 是__str__ 返回的任何字符串(我通过将其更改为return self.id 确认了这一点)。我想访问主键值,因为在某些情况下,下一步是创建另一条记录,该记录通过外键引用该记录,但我真的希望 __str__ 返回比这更有意义的东西。

我意识到我可以抓取最近创建的,但这将是具有多个并发用户的线程代码,因此有可能以真正不幸的方式失败。

我正在使用 SQLite 数据库进行开发,但将切换到 MySQL 进行生产,因此如果有解决此问题的方法需要使用 mySQL,我现在可以进行切换。

更新 - 没关系

好的,我知道发生了什么。在第一次调用 create 时没有发生,虽然 result 被定义,但它不是一个对象。

谢谢大家。进一步挖掘以响应您的 cmets 是我找到它的原因。

尴尬地溜走 >

【问题讨论】:

  • 你是如何测试result - print result 的实际值大概是多少?
  • 你在创建后打电话给.save()吗?在你的情况下,result.save() 然后记录的 id 将在 result.id - see docs
  • @LatheesanKanes, create() 确实在内部调用了save()。
  • see docs插入记录的主键值应该在result.id里面
  • @kroolik,是的,我基本上是在使用打印。由于这是在视图中,因此我将其发送到页面并添加代码以在此处显示。

标签: python mysql django sqlite


【解决方案1】:
# No reporters are in the system yet.
>>> Reporter.objects.all()
[]

# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')

# Save the object into the database. You have to call save() explicitly.
>>> r.save()

# Now it has an ID.
>>> r.id
1

# Now the new reporter is in the database.
>>> Reporter.objects.all()
[<Reporter: John Smith>]

# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'

另请参阅:https://docs.djangoproject.com/en/1.5/intro/overview/

【讨论】:

    【解决方案2】:

    result.pk 应该给你主键 “pk”是定义为主键的字段的别名。

    【讨论】:

    • 我同意,应该。我希望它做到了。有关详细信息,请参阅我对 Daniel 帖子的回复。
    【解决方案3】:

    调用create 的动作将新实例保存到数据库中。 result 现在有一个 pk 属性,这是它的 id。

    注意result 是实际对象,而不是__str__ 的结果。另外,您可以使用对象而不是其 ID 来设置另一个对象的外键。

    【讨论】:

    • 如果这是真的,我会非常高兴——我希望得到一个对象,但是当我尝试引用 result.pk 或 result.id 时,我得到一个属性错误:AttributeError: 'str' object has no attribute 'id'。当我将__str__ 方法更改为指向self.id 时,我得到了id,这使得create() 方法本身似乎返回__str__ 值而不是整个对象。
    • 我刚刚尝试完全删除__str__; result 作为空字符串返回。
    • 哦,得到对象绝对是我的第一选择。我愿意接受密钥,这样我就可以在数据库中查询对象,但当然避免不必要的数据库访问是一件好事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多