首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用预定义的aplphabetic部分(Django python)声明一个自动递增的字母数字id字段

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

Stack Overflow用户
提问于 2020-02-07 12:01:31
回答 3查看 1.7K关注 0票数 1

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

我想在我的模型中插入一个自动递增字母数字ID字段,默认情况下,它有一个固定的字母部分和一个自动递增的数字部分。

但我也想要的可用性,从管理部分,这个id到另一个字母数字,一个不同的字母数字和数字部分。

请注意:我不想覆盖django默认id字段,我只想在我的模型中包含一个作为默认值的字段,该字段将自动递增一个字母数字值。

我想要的例子:

  • 所需字母常量部分: ITM
  • 所需的数字自动增量部分: 00000 这样,我的模型中的每个对象在生成时都会得到默认的累进值,比如: ITM00001、ITM00002、ITM00003、.
  • 另外,我希望能够将字段值从我的管理部分更改为像ABC0000001、DFG0051、RST034、.
  • 最大字段长度: 10 (也可以更高)

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

代码语言:javascript
复制
class my_model(models.Model):

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

我应该编写什么样的代码才能得到一个具有我上面描述的特性的字段?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-27 23:51:19

已解决:

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

在models.py:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2020-02-07 12:16:38

为什么不使用属性方法来生成该id而不是存储它呢?例如:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2020-02-07 12:16:22

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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60113117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档