Django生成自定义ID

时间:2018-08-29 06:03:26

标签: python django django-models

我看到了this answer,但没有具体答案。我想创建以字母开头的自定义id。当新记录进入数据库时​​,我想将id更改为A00001,...。A00002,...。A00010,... A10000等。id始终在{ {1}}那么我该怎么做?

我的模型很简单:

99999- 00001

5 个答案:

答案 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_keyunique=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