如何在Django中创建健壮的复合主键?

时间:2019-07-12 17:57:03

标签: python django database model

我想在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()

0 个答案:

没有答案