Как убедиться, что поле модели является инкрементным номером для моей модели?
У меня есть следующая модель в 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. Возможно, но нужно много думать .