代码之家  ›  专栏  ›  技术社区  ›  Stan Reduta

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

  •  3
  • Stan Reduta  · 技术社区  · 7 年前

    对于我的模型,我使用默认的自动递增 PrimaryKey/id 领域我还有一个字段叫做 serialNumber 根据设计应参考 id 并根据 身份证件 例如,如果 身份证件 1234 序列号 字段应为字符串 '00001234' .

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

    序列号 在DB中创建记录后,但我的具体情况需要 序列号 与对象初始创建一起设置,因为在它之后,我通过返回记录 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)
    

    我收到的价值 身份证件 但为时已晚,因为不久之后 .save() 我的 REST API 返回创建对象的响应,我不想添加管理 序列号 到序列化程序。

    最重要的 .保存() 方法 MyModel 也不起作用:

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

    Id 字段仍然返回 没有一个 .

    任何人都知道如何访问 身份证件 记录初始创建期间的价值?

    1 回复  |  直到 3 年前
        1
  •  3
  •   Navid Zarepak    7 年前

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

    Auto-incrementing primary keys

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

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