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

How to declare a auto-incrementing alphanumerical id field with predefined aplphabetic part (Django python)

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

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

我想要的例子:

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

class my_model(models.Model):

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

我应该编写什么代码来获得具有我上面描述的特征的字段?

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

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,而不是存储它?例如:

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)

如果你关心过滤,那么你可以使用custom manager method:

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()
   

已解决:

因为我的 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)