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']