如何使用预定义的非字母部分声明一个自动递增的字母数字 id 字段 (Django python)
How to declare a auto-incrementing alphanumerical id field with predefined aplphabetic part (Django python)
我正在用 Django 开发应用程序。
我想在我的模型中插入一个自动递增的字母数字 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(???)
我应该编写什么代码来获得具有我上面描述的特征的字段?
也许您可以将您的字段拆分为三个单独的字段:
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)
我正在用 Django 开发应用程序。
我想在我的模型中插入一个自动递增的字母数字 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(???)
我应该编写什么代码来获得具有我上面描述的特征的字段?
也许您可以将您的字段拆分为三个单独的字段:
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)