Django中自定義帶有字首/字尾的遞增主鍵
阿新 • • 發佈:2021-06-10
最近專案中遇到一個需求,在Django的model中主鍵要帶有字首的遞增型別主鍵,比如:exp-1, exp-2...,類似.這樣,而且在所有的model中,主鍵裡面遞增的資料要唯一,不能有重複。也就是如果有A和B兩個model,那麼當exp-1在A中使用過之後就不允許在B中再使用。在網上找了一圈沒有找到特別好的實現方法,自己寫了一個,在這裡做個記錄。
同步發表於個人站點:http://panzhixiang.cn
我採用的方法其實也很簡單:
- 建立一個單獨的model,裡面只有一個models.AutoField型別的欄位,可以確保主鍵中遞增的數字是全域性唯一的
- 在實際業務model中定義一個models.CharFiled型別的主鍵
- 修改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)