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

时间:2017-11-01 23:20:39

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

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

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

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

我尝试使用REST API,但pre_save返回signals

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到序列化程序的代码。

覆盖.save()的{​​{1}}方法无效:

MyModel

def save(self, *args, **kwargs): print(self.id) super(MyModel, self).save(*args, **kwargs) 字段仍会返回Id

任何人都知道如何在初始创建记录期间访问None值?

1 个答案:

答案 0 :(得分:1)

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

django文件中也对此进行了解释:

Auto-incrementing primary keys

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

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