2011-10-29 4 views
8

मेरी प्रोजेक्ट में मैं श्रेणियों के लिए django-mptt का उपयोग कर रहा हूं।Django-mptt ऑर्डर

मेरे मॉडल:

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() जो आदेश निर्दिष्ट का सम्मान करना चाहिए के साथ अपने डेटाबेस के पुनर्निर्माण कर सकते हैं।

+3

, चलाने के लिए आदेश'() है Category.objects.rebuild ' । –

2
हाल mptt संस्करण के साथ

(जैसे 0.8.7) आप TreeForeignKey क्षेत्र का उपयोग करना चाहिए: `Django-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'] 
संबंधित मुद्दे