Python 如何在“中强制执行连续编号”;透过「;模型场

Python 如何在“中强制执行连续编号”;透过「;模型场,python,django,Python,Django,我正在使用Python3.7和Django3.1 我有两种模式:文本和版本。有固定数量的文本,用户将能够创建版本,在其中,他们可以按照自己想要的顺序放置这些文本。这是通过“通过”模型EditionTextThrough实现的,EditionTextThrough跟踪给定文本在给定版本中的位置: class EditionTextThrough(models.Model): text = models.ForeignKey(Text, on_delete=models.CASCADE)

我正在使用Python3.7和Django3.1

我有两种模式:文本和版本。有固定数量的文本,用户将能够创建版本,在其中,他们可以按照自己想要的顺序放置这些文本。这是通过“通过”模型EditionTextThrough实现的,EditionTextThrough跟踪给定文本在给定版本中的位置:

class EditionTextThrough(models.Model):
    text = models.ForeignKey(Text, on_delete=models.CASCADE)
    edition = models.ForeignKey(Edition, on_delete=models.CASCADE)
    position = models.PositiveSmallIntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(372)])

    class Meta:
        ordering = ['edition', 'position']
        unique_together = ['edition', 'position']
这个很好用。但是,我想强制“position”属性相对于与其配对的版本进行连续编号。Django自动生成的ID不会这样做,因为它们只是分配给表中的每一行,而不是从表中包含的每一个版本开始。Django的ID无法实现我想要的功能,还有另一个原因:我希望“位置”数字保持连续,即使其中一些被删除:

现在,如果第三个条目被删除,我不想看到
1,2,4,5
,而是:

position | edition_id | text_id
1        | uuid       | 4
2        | uuid       | 22
3        | uuid       | 16
4        | uuid       | 3

位置值本身并不重要,但仅用于指示给定文本在给定版本中的位置。我不希望最后出现像
1、2、4、5这样的间隙,所以我需要一种方法来强制此列使用连续的升序数字(同样,相对于版本uuid)。我意识到这可能不是一件小事,但它是我程序运行的基础,因此我认为花时间来解决它是值得的。

我意识到这是一个愚蠢的问题。我不想抨击Django或其他类似的框架,但它们确实倾向于灌输一种心态,在这种心态中,您希望该框架能够为您提供一种现成的方式来处理所有事情,您只需要了解在给定的情况下它是什么

显而易见的解决方案是重写EditionTextThrough模型的delete()方法,这样每当删除一个实例时,它都会遍历该版本的其余实例,并从1开始连续重新分配它们的“位置”号。作为一个编程问题,这是显而易见的。作为一个“Django问题”,这对我来说并不明显

position | edition_id | text_id
1        | uuid       | 4
2        | uuid       | 22
3        | uuid       | 16
4        | uuid       | 3