如何在 Django 模型中创建一个字段,将特定字符串连接到每个记录的 ID?

How can I make a field in Django models that concatenates a specific string to each record's id?

我在 Django 模型中创建了一个字段 facility_id,它应该将左侧的特定字符串 "ACCTS-" 与右侧每个记录的 id 连接起来,

我的模型class如下:

class Facility(models.Model):
    ...
    id = models.BigAutoField(primary_key=True)
    facility_id = models.CharField(max_length=50, default=print(f'{"ACCTS-"}{id}'), editable=False)
    ...

我希望 facility_id 字段存储特殊且可读的人性化 facility_id 格式:ACCTS-1ACCTS-2ACCTS-3, ...对应每个个体id.

迁移没有引发任何错误,但是当我尝试在 Django Admin 中为此 table 创建记录时,我得到 IntegrityError 的:

IntegrityError at /admin/ACCTS_CLYCAS/facility/add/
NOT NULL constraint failed: ACCTS_CLYCAS_facility.facility_id

我该如何解决这个问题,或者什么是解决我的问题的最简单方法。

The migrations didn't throw any errors, however When I try to create the records for this table in the Django Admin

这是有道理的,因为您已经设置了 default=None。实际上,print(…) returns None 并且只将值打印到标准输出通道 (stdout)。因此,它不会在 id 的值前面加上 ACCTS.

如果 facility_id 都是以 ACCTS- 为前缀的 id,您可以使用 @property 代替:

class Facility(models.Model):
    id = models.BigAutoField(primary_key=True)
    
    <strong>@property</strong>
    def <strong>facility_id</strong>(self):
        return f'ACCTS-{self.id}'

您也可以尝试使用 post 保存信号。

将 blank = True 添加到 facility_id,然后使用 post 保存信号更新 facility_id 的值。

您可以观看本教程了解如何使用Django Signals