Первый подход:
Вы можете создать поле новой модели 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
больше, чем удалено.
Вот пример:
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 )
Оба метода могут вызвать большие блокировки в таблицах.Помните, что необходима атомарная операция, вы должны использовать транзакций .