我看到了这个答案,但还没有具体的答案。我想创建id以字母开头的自定义。当新记录进入数据库时,我想将其更改id为 A00001, .... A00002, .... A00010, ...A10000 等。id将始终在范围内,99999- 00001所以我该怎么做?
我的模型很简单:
class Custom(models.Model):
id = models.AutoField(primary_key=True, editable=False)
Run Code Online (Sandbox Code Playgroud)
该AutoField字段是一种IntegerField字段,因此您不能将 PK 用作A00001.
因此,实现要求的可能方法是AutoField将CharField.
从技术上讲,您可以使用“String PK Field”但是,如果您打算使用它,您应该意识到问题/性能问题。
在这里,我发现了一篇很好的 SO 帖子,解释了相同的内容 - SQL 数据库中的字符串作为主键
================================ ==========================================
如果你仍然真的希望迁移到String PKs,请阅读以下
首先你需要使用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)Run Code Online (Sandbox Code Playgroud)
小智 5
如果您计划引用表,则字符串作为主键不是一个好主意,因此我建议您添加一个属性,例如:
class Custom(models.Model):
id = models.AutoField(primary_key=True, editable=False)
@property
def sid(self):
return "A%05d" % self.id
Run Code Online (Sandbox Code Playgroud)
要进行查询,您可以处理输入值,例如:
s_input = "A%05d" % 231 # 'A00231'
number = s_input[1:] # '00231'
input_id = int(number) # 231
Run Code Online (Sandbox Code Playgroud)