Django 生成自定义 ID

4 python django django-models

我看到了这个答案,但还没有具体的答案。我想创建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)

JPG*_*JPG 7

AutoField字段是一种IntegerField字段,因此您不能将 PK 用作A00001.

因此,实现要求的可能方法是AutoFieldCharField.

从技术上讲,您可以使用“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)

  • 这段代码很难在生产中使用。如果多个用户同时尝试,则会引发 IntegrityError。 (7认同)

小智 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)