1

我正在用 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(???)

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

4

3 回答 3

2

为什么不使用属性方法来生成该 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()
   
于 2020-02-07T12:16:38.873 回答
1

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

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)
于 2020-02-07T12:16:22.967 回答
0

解决了:

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

模型.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)
于 2020-02-27T23:51:19.607 回答