Как убедиться, что поле модели является инкрементным номером для моей модели?

У меня есть следующая модель в django:

class Page(models.Model):
    page_number = models.IntegerField()
    ...

и я хотел бы убедиться, что номер страницы продолжает быть последовательностью целых чисел без пробелов, даже если я удалю некоторые страницы в середине существующих страниц в базе данных. Например, у меня есть страницы 1, 2 и 3, удалите страницу 2, и страница 3 станет страницей 2.

На данный момент я не обновляю номер_страницы, а восстанавливаю возрастающую последовательность без пробелов в моем фронт-энде следующим образом:

  • запрос страниц
  • сортирует их в соответствии с номером страницы
  • назначение нового page_order, который является инкрементным и без пробелов

Но это не кажется лучшим способом...

По сути, вам придется вручную опускать все страницы вниз

Когда вы перейдете к пользовательским представлениям, вы сделаете примерно следующее:

def deletePage(request):
    if request.method = 'POST':
        pageObj = Page.objects.filter(page_number=request.POST.get('page_number')).first()
        if pageObj:
            pageObj.delete()

            # Note: Using F() means Django doesn't need to Fetch the value from the db before subtracting
            #   - It's a blind change, it's faster though
            from django.db.models import F
            for i in Page.objects.filter(page_number__gt=request.POST.get('page_number')):
                i.page_number = F('page_number') - 1
                i.save()

        else:
            # No Page Object Found
            # Raise some error
            pass

Страница администратора сложнее, в основном вы делаете то же самое, но в функциях, описанных в: Django admin: override delete method

  • Примечание: Удаление нескольких будет сложным, особенно если вы удаляете страницу 2 + 4 + 5. Возможно, но нужно много думать
  • .
Вернуться на верх