【问题标题】:django model: get primary key of the model just createddjango模型:获取刚刚创建的模型的主键
【发布时间】:2016-01-05 19:07:23
【问题描述】:

模型定义如下:

class UnitTab(models.Model):
    unit_id = models.PositiveIntegerField(primary_key=True)
    create_time = models.PositiveIntegerField()
    update_time = models.PositiveIntegerField()
    read_db_connection = 'game_center_admin_db'
    write_db_connection = 'game_center_admin_db'

    class Meta:
        db_table = u'unit_tab'

    def save(self, *args, **kwargs):
        curr_time = int(time.time())
        if not self.create_time:
            self.create_time = curr_time
        self.update_time = curr_time
        super(UnitTab, self).save(*args, **kwargs)

    def __unicode__(self):
        return u'unit_tab_%s' % (self.unit_id)

我只是用UnitTab.objects.create() 保存UnitTab 来创建一个新对象。 unit_idauto_increment,所以我不必设置它。 但是如果我使用"u = UnitTab.objects.create()",我返回的对象"u"unit_id 为无——尽管保存成功。那么我如何才能获得我刚刚保存/创建的UnitTabprimary key(unit_id)

编辑:我的项目使用 Django 1.6.11

编辑:我记录了这些属性,发现在u.save() 之后,unit_id 为无。 create_timeOK,实体保存成功。

编辑:从 PositiveIntegerField 更改为 AutoField 后,unit_id 字段在 save() 之后自动分配。只是不知道为什么会这样。

【问题讨论】:

    标签: python django django-models primary-key


    【解决方案1】:

    创建新对象后:

    u = UnitTab.objects.create()

    通过使用refresh_from_db() 方法从数据库中刷新其值来跟踪它。

    u.refresh_from_db()

    您可以在此处找到此信息:

    https://docs.djangoproject.com/en/1.9/ref/models/instances/#refreshing-objects-from-database

    编辑:

    如果您使用的是 django 1.6,请使用 save() 方法,您应该可以像这样访问它:

    >>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
    >>> b2.id     # Returns None, because b doesn't have an ID yet.
    >>> b2.save()
    >>> b2.id     # Returns the ID of your new object.
    

    https://docs.djangoproject.com/en/1.6/ref/models/instances/#auto-incrementing-primary-keys

    【讨论】:

    • 很遗憾我使用的是 Django 1.6.11。 1.6有类似的东西吗?
    • @JunchaoGu 我为你更新了我的答案。只需使用save() 方法。
    • 正如公认的答案所建议的那样,使用 AutoField 就可以了
    • @JunchaoGu AutoField 刚刚解决了您的 PK 不是自动递增的事实。也许它一开始是 None 类型的对象,所以通过访问它,你得到了 None。
    • 但是据说--如果我错了,请纠正我,在调用 save 之后,pk 应该填充实际值。使用 PositiveIntegerField 时,保存后 pk 仍然是 None。使用 AutoField 很好
    【解决方案2】:

    您是否有什么特别的原因不想改用models.AutoField

    unit_id = models.AutoField(primary_key=True)
    

    【讨论】:

    • 我刚刚检查并使用 AutoField 确实有效。只是想知道为什么会发生这种情况
    • 呃,因为这是 AutoField 的作用,而其他字段则没有。
    • 但是“刷新”是否适用于所有主键字段? @丹尼尔
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2011-09-09
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多