2012-05-21 3 views
3

적절한 방식으로 자녀 모델을 주문할 모델을 만들고 싶습니다. 예를 들어, 장부에는 장이 여러 개 있지만 장은 특정 순서로 있어야합니다.Django : 주문한 형제를 만드는 방법

나는 다음과 같은 질문이 시사하는 것처럼 장 순서를 지정하는 장 모델 상에 IntegerField을 둘 필요가 있다고 가정합니다 Ordered lists in django

내 주요 문제는 그 나는 사이에 새로운 장을 삽입 할 때마다 두 개의 기존 챕터 또는 어떤 식 으로든 순서를 바꾸면 책의 모든 챕터를 (거의) 업데이트해야합니다. 명령을 변경할 때마다 모든 장의 모든 인덱스를 수동으로 변경하지 않아도되는 방법이 있습니까?

위의 링크 된 질문에서 제안한대로 "링크 된 목록"스타일 모델을 만드는 데 큰 팬이 아닙니다. 데이터베이스를 만드는 것이 좋지 않다는 느낌을 받고 있습니다.

이 관계를 모델링하는 "올바른"방법은 무엇입니까?

답변

2

효율적으로 아마도 원시 SQL 문 UPDATE Chapter SET order = order + 1 WHERE book_id = <id_for_book> AND order <= <insert_index_location>이 필요할 것입니다. Django 1.1+의 경우 : F()을 사용하면 한 줄에 다음과 같이 작성할 수 있지만 트랜잭션을 사용하는 경우에는 O (n) 개의 쿼리가있을 수 있습니다.

Book.objects.get(id=<id_of_book>).chapter_set.filter(order__gt=<place_to_insert>).update(order=F('order')+1) 
+0

감사합니다. 내가하고있는 일에 대해, 나는 그것을 빨아 들였고 수동으로 IntegerField를 변경했다. (나는 많은 양의 데이터를 가지고 있지 않다.) 그러나 나는 이것을 설명하기위한 "올바른 방법"으로 매우 관심이있다. –

+0

왜 float를 사용하고 단일 행을 업데이트하는 것보다 정수를 사용하고 많은 행을 업데이트하는 것이 좋습니까? –

+1

불연속 부동 소수점과 이산 정수를 섞어서 순서를 매기는 것은 나쁜 습관이라고 생각합니다. 책의 챕터 순서는 인덱스와 같으며 항상 정수입니다. 부동 소수점과 같은 숫자 범위를 허용하면 바로 가기를 만들기 위해 예기치 않은 결과가 나타나는 순서 필드를 열었습니다. 제쳐두고, 실제로는 관련이 없지만 부동 소수점 연산 (비교)은 부동 소수점 연산이 정수로 표현되므로 정수 연산보다 느립니다. – Furbeenator

2

둘 사이에 삽입 할 때 여러 항목을 업데이트하는 문제를 피하려면 정수 대신 부동 소수점을 사용하십시오.

항목 42와 항목 43 사이에 항목을 삽입하려는 경우 두 항목 사이의 중간 값 (42.5)을 지정하면 다른 항목을 업데이트 할 필요가 없습니다.

x와 y ... z.order = 사이

삽입 Z (y.order - x.order)/2 + x.order

당신이 언급 대답은 아마이 문제를 처리하는 가장 좋은 방법이었다
+0

흠, 내가 정확히 무엇을 찾고 있는지 확실하지 않습니다. 그것은 작동해야하지만, 끊임없이 값을 나누는 것은 약간 hackish하다고 느낍니다. –

관련 문제