Django项目ID搞砸了

时间:2012-01-07 19:59:05

标签: sql django

有没有办法清理/重新校准表的ID号?编辑和删除某些对象后,我的ID中存在空白。

ex:1,2,3,4,5,6,7,8,21,22,23,24,25,29,30,31...

Django只会在最高ID之后逐步添加新项目,并且差距会导致问题。我正在使用Postregsql。

1 个答案:

答案 0 :(得分:1)

第一种方法:

您可以创建新的模型字段item_number。然后,“手动”保留这个新字段:

  • 在保存()时:如果此保存是插入,则应将item_number计算为表item_number的最大值。请记住,此操作可能会导致锁定。

也许,最轻松的方法是:

def save(self, *args, **kwargs):
    if not self.pk:
       self.item_number = Entry.objects.latest('item_number') + 1 if 
                          Entry.objects.exists() else 0
    super(Model, self).save(*args, **kwargs)
  • 关于删除():您应该使用item_numer grather而不是删除的所有模型进行重新计算。

这是一个示例:

def delete(self, *args, **kwargs):
    super(Model, self).save(*args, **kwargs)
    myModel.objecte.filter( item_number__gt = self.item_number).update(
            item_number=F('item_number') - 1 )

这两种方法都可能导致表中的大锁。请记住,需要进行原子操作,您应该使用transactions