在创建 Django 记录期间访问主 key/id 值

Access primary key/id value during creation of a Django record

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

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

我在数据库中创建记录后更新 serialNumber 没问题,但我的具体情况需要 serialNumber 与对象初始创建一起设置,因为紧接着我 return 通过 REST API.

记录

我尝试使用 signals,但是 pre_save returns 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 return 对创建的对象做出了响应,我不想将管理 serialNumber 的代码添加到序列化程序。

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

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

Id 字段仍然 returns None.

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

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

这在 django 文档中也有解释:

Auto-incrementing primary keys

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

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