Ponieważ nie znalazłem jeszcze "zautomatyzowanego" sposobu na zrobienie tego, myślę o następującym obejściu - byłoby to wykonalne w mojej konkretnej sytuacji:
- Ustaw sekwencję za pomocą MAXVALUE 49999 BEZ CYKLU
- Po osiągnięciu 49999 następny save() spowoduje błąd postgresu
- Złap ten wyjątek i ponownie podnieś jako błąd formularza „skończyły Ci się liczby, zresetuj do następnego bloku, a następnie spróbuj ponownie”
- Zapewnij widok, w którym użytkownik może aktywować następny blok, tj. wykonać „ALTER SEQUENCE my_seq RESTART WITH 70000 MAXVALUE 89999”
Nie podoba mi się automatyczne ponowne uruchomienie po złapaniu wyjątku:
try:
instance.save()
except RunOutOfIdsException:
restart_id_sequence()
instance.save()
ponieważ obawiam się, że dwa współbieżne metody save() wyczerpią się z identyfikatorów, doprowadzą do dwóch oddzielnych ponownych uruchomień, a następnie naruszenia ograniczenia unikalności. (w zasadzie ta sama koncepcja, co oryginalny problem)