2010-12-11 3 views
1

Django에서 문서 (단락) 수정 시스템을 가장 잘 구현하는 방법을 파악하는 데 문제가 있습니다.Django 문서 개정 시스템에서 단락 순서를 유지하는 방법은 무엇입니까?

문서의 개정 내역을 단락별로 저장하려고합니다. 즉, ManyToManyField ~ Paragraph의 클래스 Document이 있습니다. 단락의 순서를 유지하기 위해 세 번째 클래스 인 ParagraphContainer을 만들 수 있습니다.

제 질문은 누군가가 기존 단락 사이에 새로운 단락을 추가 할 때 단락 순서가 유지되도록 장고에서 이것을 구현하는 좋은 방법은 무엇입니까?

확실한 방법 중 하나는 ParagraphContainer 클래스에 position 속성을 지정하는 것이지만이 필드는 삽입 된 (또는 삭제 된) 단락 다음의 모든 단락에서 업데이트되어야합니다. 연결된 목록이 또 하나의 옵션이지만 전체 문서를 검색하는 데 매우 느려질 수 있다는 사실에 두렵습니다. 어떤 충고?

답변

2

편집자는 종종 피스 테이블으로이 문제를 해결합니다. 테이블은 a) 메모리에서 연속적이며 b) 공통 속성을 공유하는 문자의 범위를 가리키는 객체 목록입니다. 테이블의 조각 순서는 문자와 문서의 주소를 메모리에 매핑하거나 그 반대로 매핑하는 데 사용됩니다. 조각 테이블을 재정렬하면 아무 것도 움직이지 않고 문서의 순서가 효율적으로 바뀝니다. 요점은 조각 테이블 자체가 문서의 내용을 구성하는 개체와 독립적이라는 것입니다.

단락 순서를 매핑하는 한 가지 방법은 단순화 된 버전의 피스 테이블을 만드는 것입니다. 이것은 문서 순서에서 para-ids의 목록처럼 간단 할 수 있습니다. 무언가를 바꿀 필요가있을 때, 목록을 가져 와서 꺼내고, 목록에있는 을 수정하고 피클 저장하십시오.

테이블의 또 다른 이점은 실행 취소 구현을 크게 단순화한다는 것입니다. 히스토리 파일은 테이블에 대한 간단한 편집 목록이며 실행 취소/다시 실행은 특정 편집을 취소하거나 테이블에 다시 적용 할 때 데이터 자체가 변경되지 않습니다. 이 작업은 원하는 모든 버전 관리와 원활하게 작동해야합니다.

1

당신이 order 속성을 가진 through table to your ManyToManyField를 추가 할 경우이 문제를 해결할 수 있습니다 cource의

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 -signal을 사용하십시오!

+0

Paragraph.save 우선 적용 해 주셔서 감사합니다. 그 자체로 알아두면 유용합니다. 당신의 대답은 기본적으로'position' 속성 ('order')을 가지고 마음에두고 있었던 것이지만, 삽입되는 문장 다음의 다른 모든 단락을 업데이트하는 것을 수반합니다. 1000 단락을 초과 할 때 비효율적 일 수 있습니다 (원격 가능성). 아니면 삽입 효율성과 검색 효율성간에 균형을 맞추어야하는 경우 중 하나입니까? –

+0

단락을 추가하고 가져 오는 것은 당연히 그 솔루션에서 매우 쉽습니다. 재 순서화가 필요한 객체의 수와 사용 사례 '삽입'이 얼마나 일반적인지를 파악하기 위해 사례를 평가할 필요가 있다고 생각합니다. 또한 '다음'단락을 가리키는 'ForeignKey'가있는 솔루션을 생각할 수도 있지만 DB의 순서 지정 함수를 사용할 수 없으므로 검색시 더 복잡합니다. –

+0

잠시 기다려주십시오. 누군가가 참신한 해결책을 찾았는지 알아보기 위해, 그렇지 않으면 나는 당신의 대답을 받아 들일 것입니다, 고마워요! –

관련 문제