Python 如何在Django文档修订系统中维护段落顺序?

Python 如何在Django文档修订系统中维护段落顺序?,python,django,database-design,Python,Django,Database Design,在Django中,我很难找出如何最好地实现文档(段落)修订系统 我想逐段保存文档的修订历史记录。换句话说,将有一个类文档,它有一个ManyToManyField到段落。为了保持段落的顺序,可以创建第三类段落容器 我的问题是,在Django中实现这一点的好方法是什么,以便在现有段落之间添加新段落时保持段落顺序 一个明显的方法是在ParagraphContainer类中有一个position属性,但是该字段必须在插入(或删除)段落之后的所有段落中更新。链接列表是另一种选择,但我担心这可能会对整个文档

在Django中,我很难找出如何最好地实现文档(段落)修订系统

我想逐段保存文档的修订历史记录。换句话说,将有一个类
文档
,它有一个
ManyToManyField
段落
。为了保持段落的顺序,可以创建第三类
段落容器

我的问题是,在Django中实现这一点的好方法是什么,以便在现有段落之间添加新段落时保持段落顺序


一个明显的方法是在
ParagraphContainer
类中有一个position属性,但是该字段必须在插入(或删除)段落之后的所有段落中更新。链接列表是另一种选择,但我担心这可能会对整个文档的检索非常慢。有什么建议吗?

如果您添加了一个带有
order
属性的:

class Paragraph(models.Model):
    text = models.TextField()

class Document(models.Model):
    paragraphs = models.ManyToManyField(Paragraph, through='DocumentParagraph')

class DocumentParagraph(models.Model):
    paragraph = models.ForeignKey(Paragraph)
    document = models.ForeignKey(Document)
    order = models.PositiveIntegerField()

当然,您必须添加一些用于更新订单等的自定义方法,因此您可以查看覆盖
段落。保存
,或使用
后期保存
-信号,例如

编辑器通常使用工件表来解决此问题。该表是一个对象列表,指向a)内存中连续的字符范围,b)共享公共属性的字符范围。表中片段的顺序用于将文档地址中的字符映射到内存,反之亦然。通过对工件表进行重新排序,可以有效地对文档进行重新排序,而无需移动任何东西。关键是工件表本身独立于构成文档内容的对象

因此,映射段落顺序的一种方法是使用简化版的peice表格。这可以像文档顺序中的para id列表一样简单。当您需要更改某些内容时,您可以获取列表,取消勾选列表,对列表进行编辑,然后进行pickle和save


该表的另一个优点是,它大大简化了撤消的实现。历史文件是对表的编辑的简单列表,撤消/重做是对表进行特定编辑的反转或重新应用,数据本身不会更改。这应该适用于您想要执行的任何版本控制。

感谢您提供了最重要的段落。保存提示,了解它本身很有用。你的答案基本上就是我对我的
位置
属性(你的
顺序
)的想法,但需要在插入的段落之后更新所有其他段落,如果有人的段落超过1000段,这可能会导致效率低下(可能性很小)。或者这只是我必须在插入效率和检索效率之间进行权衡的一种情况吗?当然,使用这种解决方案,附加和检索段落是非常容易的,与之相比,插入需要一段时间。我想您需要评估您的案例,以了解您正在处理的可能需要重新描述的对象的数量,以及用例“插入”的常见程度。我也可以想出一个带有
ForeignKey
指向“下一个”段落的解决方案,但在检索时这更复杂,因为你不能使用db的排序函数……我会等一会儿看看是否有人提出了一个新的解决方案,否则我会接受你的答案,谢谢!