如何声明一个具有预定义的aplphabetic部分(Django python)的自动递增字母数字id字段



我正在用Django开发一个应用程序。

我想在我的模型中插入一个自动递增的字母数字 ID 字段,默认情况下,该字段具有固定的字母部分和一个自动递增的数字部分。
但我也希望可用性从管理部分更改为另一个字母数字 ID,具有不同的字母数字和数字部分。
请注意:我不想覆盖 django 默认 id 字段,我只想在我的模型包含一个字段,该字段将自动递增的字母数值作为默认值。

我想要的例子:

  • 所需的字母常量部分:ITM

  • 所需的数字自动递增部分:00000

    这样我的模型的每个对象在生成时都会获得默认值 渐进式值,例如:ITM00001、ITM00002、ITM00003、...

  • 另外,我希望能够从我的管理员更改字段值 部分转换为ABC0000001、DFG0051、RST034、...

  • 最大字段长度:10(也可以更高(

我意识到我必须使用AutoField并以某种方式将常量字符串与自动递增的数值变量连接起来,但我不知道该怎么做。

class my_model(models.Model):
Field_1 = models.CharField(max_length=10, blank=True, null=True)
static_ID = models.AutoField(???)

我应该编写什么代码来获取具有我向上描述的功能的字段?

与其存储它,为什么不使用属性方法来生成该 id?例如:

class MyModel(models.Model):
field_one = models.CharField(max_length=10, blank=True, null=True)

@property
def static_id(self):
'ITM{0:07d}'.format(self.pk)

如果您关心过滤,则可以使用自定义管理器方法:

class CustomManager(models.Manager):
def get_id(self, static_id):
return int(static_id[2:])
def filter_static_id(self, static_id):
_id = self.get_id(static_id)
return self.filter(pk=_id)

def filter_static_id(self, static_id):
_id = self.get_id(static_id)
return self.get(pk=_id)
class MyModel(models.Model):
objects = CustomManager()

也许您可以将字段拆分为三个单独的字段:

class MyModel(models.Model):
PREF = "ITM"
NUMS = 5
field1 = models.CharField(max_length=10, blank=True, null=True)
...
pref = models.CharField(max_length=3, default=PREF)  # prefix that has defaul value and can be modified
nums = models.PositiveIntegerField(default=NUMS)  # the number of digits
static_id = models.AutoField(primary_key=False)  # auto increment field
class Meta:
unique_together = ('pref', 'nums', 'static_id')
@property
def static_key(self):
return self.pref + str(self.static_id).zfill(self.nums)

已求解:

由于我的 id 不需要特定的长度,也不需要两个连续 id 之间的常量增量,因此每次创建模型中的对象时,我都可以使用time.time()来获取唯一的时间数字。然后我可以将该时间数字转换为字符串,并用常量前缀将其连接起来。

在 models.py

import time
def return_timestamped_id():
prefix = "ITCH"     
timestamp = str(int(time.time()*10000000))
default_value = prefix + timestamp
return(default_value)

class my_model(models.Model):        
Field_1 = models.CharField(max_length=256)
static_ID = models.CharField(max_length=256, blank=False, null=False, default=return_timestamped_id)

最新更新