我看到了this answer,但没有具体答案。我想创建以字母开头的自定义id
。当新记录进入数据库时,我想将id
更改为A00001,...。A00002,...。A00010,... A10000等。id
始终在{ {1}}那么我该怎么做?
我的模型很简单:
99999- 00001
答案 0 :(得分:4)
AutoField
字段是一种 IntegerField
字段,因此您不能将PK用作A00001
。< br />
因此,达到要求的可能方法是将 AutoField
更改为 CharField
。
从技术上讲,您可以使用“字符串PK字段” 。但是,如果您使用它,则应该意识到问题/性能问题。
在这里,我发现了一篇很好的SO帖子,它解释了相同的内容-Strings as Primary Keys in SQL Database
========================== ============================================
如果您仍然希望迁移到字符串PK ,请阅读以下内容
首先,您需要使用 CharField
而不是 AutoField
,并覆盖模型的 save()
方法
from django.db.models import Max
class Custom(models.Model):
id = models.CharField(primary_key=True, editable=False, max_length=10)
name = models.CharField(max_length=100)
def save(self, **kwargs):
if not self.id:
max = Custom.objects.aggregate(id_max=Max('id'))['id_max']
self.id = "{}{:05d}".format('A', max if max is not None else 1)
super().save(*kwargs)
答案 1 :(得分:3)
字符串作为主键不是一个好主意,因此我建议您添加一个属性,例如:
this.props.combineName(param)
要进行查询,您可以处理输入值,例如:
class Custom(models.Model):
id = models.AutoField(primary_key=True, editable=False)
@property
def sid(self):
return "A%05d" % self.id
答案 2 :(得分:1)
我还有另一种方式,我在我的django项目中使用。这是一些代码
def ids():
no = Employee.objects.count()
if no == None:
return 1
else:
return no + 1
emp_id = models.IntegerField(('Code'), default=ids, unique=True, editable=False)
id = models.CharField(primary_key=True, editable=False, max_length=30)
def save(self, **kwargs):
if not self.id:
self.id = "{}{:08d}".format('ABC', self.emp_id)
super().save(*kwargs)
答案 3 :(得分:0)
我尝试使用@JPG的答案,但是它有一个错误。 该错误是因为它无法自动递增。 我修复了该错误,并修复了我的最终代码:
def save(self, **kwargs):
if not self.id:
max = YourModel.objects.aggregate(
id_max=models.Max('id'))['id_max']
if max is not None:
max += 1
else:
max = 100
self.id = "{:08d}".format(
max) # id from 100 to start
super().save(*kwargs)
答案 4 :(得分:0)
最好为models中的自定义id和后台的process创建一个新的字段。您可以使用 primary_key
和 unique=True
将其设置为 editable=False
:
class Custom(models.Model):
id = models.Autofield(primary_key=True, editable=False, max_length=10)
uid= models.CharField(max_length=100, unique=True)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.set_uid() # calling the set_uid function
def set_uid(self):
if not self.uid: # if uid of the instance is blank
uid = "CUS" + str(self.id + (10 ** 5)) # generating the uid
customer= Custom.objects.get(id=self.id) # getting the instance
customer.uid = uid # allocating the value
customer.save() # saving the instance
def __str__(self):
return self.uid
也可以在调用函数的set_uid()
中合并save()
:
class Custom(models.Model):
id = models.Autofield(primary_key=True, editable=False, max_length=10)
uid= models.CharField(max_length=100, unique=True)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if not self.uid: # if uid of the instance is blank
self.uid = "CUS" + str(self.id + (10 ** 5)) # generating the uid and allocating the value
self.save() # saving the instance
def __str__(self):
return self.uid