我想在Django模型中创建一个复合主键,该主键是文本前缀,然后是该前缀内的索引。 例如,我希望save()上的模型生成此顺序:
prefix - id
ABC - 1
ABC - 2
ABC - 3
ABC - 4
XYZ - 1
ABC - 5
XYZ - 2
XYZ - 3
ABC - 6
XYZ - 4
XYZ - 5
etc.
我已经尝试用unique_together = [['Prefix','Id']]创建元数据 这样做具有唯一性,但不会计算每个前缀的最低ID,而是始终将ID递增:
prefix - id
ABC - 1
ABC - 2
ABC - 3
ABC - 4
XYZ - 5
ABC - 6
XYZ - 7
XYZ - 8
ABC - 9
XYZ - 10
XYZ - 11
etc.
class Invoice(models.Model):
prefix = models.CharField(max_length=12, default='')
invoice_ref = models.CharField(max_length=40, default='')
class Meta:
unique_together = [['prefix', 'id']]
我可以在重载的save()方法中计算ID,但是这种方法有多健壮?对数据库将有几个非原子查询:
def save(self):
try:
m = Invoice.objects.last(prefix=self.prefix)
self.id = m.id + 1
except Exception as e:
# if not found, start from 1
self.id = 1
super().save()