Неправильные идентификаторы предметов в Django - PullRequest
0 голосов
/ 07 января 2012

Есть ли способ очистки / перекалибровки идентификационных номеров для таблицы?После редактирования и удаления некоторых объектов в моих идентификаторах есть пробелы.

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

Django просто постепенно добавляет новые элементы после самого высокого идентификатора, и пробелы вызывают проблемы.Я использую Postregsql.

1 Ответ

1 голос
/ 08 января 2012

Первый подход:

Вы можете создать поле новой модели 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 )

Оба метода могут вызвать большие блокировки в таблицах.Помните, что необходима атомарная операция, вы должны использовать транзакций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...