2011-10-29 2 views
8

제 프로젝트에서 카테고리에 django-mptt를 사용하고 있습니다.Django-mptt order

내 모델 :

class Category(models.model): 
    name = models.CharField() 
    parent = models.ForeignKey("self", blank=True, null=True, 
          related_name="sub_category") 
    nav_order = models.IntegerField(null=False, blank=False, default=0) 
    # unsure need nav_order column in DB 

    class Meta: 
     verbose_name_plural = 'Categories' 
mptt.register(Category) 

그리고이 같은 현재 카테고리에 대한 능력을 얻기 위해이 필요합니다 :

Category    Navigation order(one column) 

CatA      0 
|-subcat11     0 
    |-sub11a     0 
    |-sub11b     1 
    \-sub11c     2 
\-subcat12     1 
CatB      1 
|-subcat21     0 
|-subcat22     1 
\-subcat23     2 
    \-sub23a     0 
CatC      2 

나는 빨리/기입/생성 요소를 이동에 주문 열을 다시 계산할 수있는 방법. 또는 범주의 방법으로 계산하십시오. Category.objects.get(name='sub11b').get_order()은 1을 반환합니다.

답변

10

"order_insertion_by"를 사용하여 순서를 지정할 수 있습니다.

이 같은 뭔가 :

class Category(MPTTModel): 
    name = models.CharField() 
    parent = models.ForeignKey("self", blank=True, null=True, 
      related_name="sub_category") 

    class MPTTMeta: 
     order_insertion_by = ['name'] 

그런 다음 사용자가 지정한 순서를 존중해야 Category.tree.rebuild() 사용하여 데이터베이스를 재 빌드 할 수 있습니다. 최근 mptt 버전

+3

을 실행하는 명령은') (Category.objects.rebuild'이다 . –

2

(예 0.8.7)는 TreeForeignKey 필드 사용해야합니다 장고 - mptt` 버전 0.8.3 '으로

from mptt.models import MPTTModel 
from mptt.fields import TreeForeignkey 

class Category(MPTTModel): 
    name = models.CharField() 
    parent = TreeForeignKey("self", 
          blank=True, 
          null=True, 
          related_name="sub_category") 

    class MPTTMeta: 
     order_insertion_by = ['name']