如何声明带有预定义字母部分的自动增量字母数字id字段(Django python)

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

我想在模型中插入一个自动递增的字母数字ID字段,默认情况下,该字段具有一个固定的字母部分和一个自动递增的数字部分。 但我也希望将可用性从管理部分更改为另一个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(???)
评论
  • 天然呆zZ
    天然呆zZ 回复

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

    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)
    
  • 如今Ac
    如今Ac 回复

    而不是存储它,为什么不使用属性方法来生成该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()