【问题标题】:Access primary key/id value during creation of a Django record在创建 Django 记录期间访问主键/id 值
【发布时间】:2017-11-01 23:20:38
【问题描述】:

对于我的模型,我使用默认的自动递增 PrimaryKey/id 字段。我还有一个名为serialNumber 的字段,根据设计应该引用id 并根据id 值生成它自己的值。 例如,如果id1234,那么serialNumber 字段应该是一个字符串'00001234'

class MyModel(models.Model):
    ...
    serialNumber = models.TextField(max_length=8)
    ...

在数据库中创建记录后更新serialNumber 没有问题,但我的具体情况需要将serialNumber 与对象初始创建一起设置,因为之后我通过REST API 返回记录。

我尝试使用 signals,但 pre_save 返回 None

@receiver(pre_save, sender=MyModel)
def my_pre_save(sender, instance, **kwargs):
    print(instance.id)

另一方面,如果我这样做:

@receiver(post_save, sender=MyModel)
def my_post_save(sender, instance, **kwargs):
    print(instance.id)

我收到了id 的值,但为时已晚,因为在.save() 之后,我的REST API 返回带有创建对象的响应,我不想将管理serialNumber 的代码添加到序列化程序。

覆盖MyModel.save() 方法也不起作用:

    def save(self, *args, **kwargs):
        print(self.id)
        super(MyModel, self).save(*args, **kwargs)

Id 字段仍返回 None

有人知道如何在初始创建记录期间访问id 值吗?

【问题讨论】:

    标签: python django django-rest-framework django-signals


    【解决方案1】:

    嗯,在保存 ID 之前,您无法访问它。 ID 将由数据库生成,因此您必须调用 save 方法,以便 django 将数据发送到数据库,然后您将获得您的 ID

    这在 django 文档中也有解释:

    Auto-incrementing primary keys

    如果您确实需要访问作为唯一标识符的ID,您可以手动创建一个。

    您可以添加一个名为my_id 的字段,然后在保存数据之前为其指定一个唯一值(您只需要检查该值是否已经存在,如果存在,则只需创建另一个值)。这样,您将能够获得一个唯一的 ID,您将来可以使用该 ID 找到该行。

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 2016-07-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多