2011-10-29 26 views
8

Trong dự án của tôi, tôi đang sử dụng django-mptt cho các danh mục.Thứ tự Django-mptt

mô hình của tôi:

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) 

Và tôi cần phải có khả năng nhận được đặt hàng cho loại hiện tại như thế này:

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 

Làm thế nào tôi có thể nhanh chóng lấp đầy/tính toán lại cột nhằm vào việc tạo/di chuyển các yếu tố. Hoặc tính theo phương pháp của Danh mục Category.objects.get(name='sub11b').get_order() phải trả lại 1.

Trả lời

10

Khi xác định mô hình bạn có thể chỉ định thứ tự với "order_insertion_by".

Vì vậy, một cái gì đó như thế này:

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

    class MPTTMeta: 
     order_insertion_by = ['name'] 

Sau đó, bạn có thể xây dựng lại cơ sở dữ liệu của bạn với Category.tree.rebuild() mà nên tôn trọng trật tự quy định.

+3

Với 'phiên bản django-mptt' 0.8.3, lệnh để chạy là' Category.objects.rebuild() ' . –

2

Với mptt phiên bản gần đây (ví dụ 0.8.7), bạn nên sử dụng TreeForeignKey lĩnh vực:

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