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