Как поддерживать порядок абзацев в системе пересмотра документов Django? - PullRequest
1 голос
/ 11 декабря 2010

У меня возникают проблемы с поиском наилучшей реализации системы пересмотра документа (параграфа) в Django.

Я хочу сохранить историю ревизий документа, абзац за абзацем.Другими словами, будет класс Document, который имеет от ManyToManyField до Paragraph.Чтобы поддерживать порядок абзацев, можно создать третий класс ParagraphContainer.

Мой вопрос заключается в том, как правильно реализовать это в Django, чтобы порядок абзацев сохранялся, когда кто-то добавляетновый абзац между существующими абзацами?

Одним очевидным способом было бы наличие атрибута позиции в классе ParagraphContainer, но тогда это поле необходимо будет обновить во всех абзацах, следующих за вставленным (или удаленным) абзацем.Связанный список - это еще один вариант, но я боюсь, что он может быть очень медленным для получения всего документа.Любой совет?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Редакторы часто решают эту проблему с помощью Piece Table .Таблица представляет собой список объектов, которые указывают на диапазоны символов, которые а) являются смежными в памяти и б) имеют общие атрибуты.Порядок частей в таблице используется для отображения адресов символов в документе в память и наоборот.Изменяя порядок таблицы элементов, вы эффективно изменяете порядок документа, ничего не перемещая.Ключевым моментом является то, что сама таблица элементов не зависит от объектов, составляющих содержимое документа.

Так что одним из способов отображения порядка абзацев будет упрощенная версия таблицы peice.Это может быть так же просто, как список параметров в порядке документа.Когда вам нужно что-то изменить, вы извлекаете список, распаковываете его, вносите изменения в список , выбираете и сохраняете.

Другое преимущество таблицы заключается в том, что она значительно упрощает реализацию отмены.,Файл истории представляет собой простой список изменений в таблице, а отмена / повторное выполнение - это изменение или повторное применение определенного редактирования к таблице, сами данные не изменяются.Это должно хорошо сочетаться с любой версией, которую вы хотите сделать.

1 голос
/ 11 декабря 2010

Вы можете решить эту проблему, добавив таблицу through в ManyToManyField с атрибутом 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()

Конечно, вам придется добавить несколько пользовательских методов для обновления порядка и т. Д., Для этого вы можете посмотреть на переопределение Paragraph.save или использовать, например, post_save -сигнал!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...