1. 程式人生 > 其它 >Django中自定義帶有字首/字尾的遞增主鍵

Django中自定義帶有字首/字尾的遞增主鍵

最近專案中遇到一個需求,在Django的model中主鍵要帶有字首的遞增型別主鍵,比如:exp-1, exp-2...,類似.這樣,而且在所有的model中,主鍵裡面遞增的資料要唯一,不能有重複。也就是如果有A和B兩個model,那麼當exp-1在A中使用過之後就不允許在B中再使用。在網上找了一圈沒有找到特別好的實現方法,自己寫了一個,在這裡做個記錄。

同步發表於個人站點:http://panzhixiang.cn

我採用的方法其實也很簡單:

  1. 建立一個單獨的model,裡面只有一個models.AutoField型別的欄位,可以確保主鍵中遞增的數字是全域性唯一的
  2. 在實際業務model中定義一個models.CharFiled型別的主鍵
  3. 修改save方法,為業務模型的主鍵加上字首

下面是示例程式碼,可以參考

fromdjango.dbimportmodels


classAutoIncrementFields(models.Model):
"""
provideauniqueIDforallmodelsofcodesign
"""
id=models.AutoField(primary_key=True)
def__str__(self):
returnstr(self.id)


class A(models.Model):
    """
    example
    """
    case_id = models.CharField(max_length=128, primary_key=True)  # custom save func will cover this field
    
    def save(self, *args, **kwargs):
        """
        customize primary key like exp-1, exp-2...
        :param args:
        :param kwargs:
        :return:
        """
        _ = AutoIncrementFields.objects.create()
        self.case_id = 'exp-' + str(_.id)
        return super(A, self).save(*args, **kwargs)


class B(models.Model):
    """
    example
    """
    case_id = models.CharField(max_length=128, primary_key=True)  # custom save func will cover this field
    
    def save(self, *args, **kwargs):
        """
        customize primary key like exp-1, exp-2...
        :param args:
        :param kwargs:
        :return:
        """
        _ = AutoIncrementFields.objects.create()
        self.case_id = 'exp-' + str(_.id)
        return super(B, self).save(*args, **kwargs)