2012-06-02 25 views
9

Tôi mới dùng Django và MPTT và gặp khó khăn trong việc tìm ra cách lấy tất cả các nút lá và gửi chúng trực tiếp đến lớp Biểu mẫu. Ví dụ, tôi đã tạo MPTT Thể loại Model, và có hệ thống phân cấp như thế này:Django và MPTT - chỉ nhận các nút lá

  • mục1
    • mục2
    • Category3
  • Category4
    • Category5
    • Category6

Vì vậy, tôi muốn duy nhất để loại lá (cat2,3,5,6) .My Mẫu lớp trông giống như sau:

class UploadForm(forms.Form): 
    description = forms.CharField(max_length=50) 
    category = mpttform.TreeNodeMultipleChoiceField(queryset=Category.objects.all()) 
    file = forms.FileField() 

Và với queryset = Category.objects.all() Tôi nhận được chính xác những điều tương tự ở trên - tất cả các loại và con của nó. Có cách nào tôi có thể nhận được chỉ có các nút lá (trẻ em), nhưng các nút lá từ tất cả các loại, không phải từ thể loại cụ thể? Cảm ơn.

Trả lời

18

không được sử dụng django mptt trong một thời gian, nhưng cho rằng một nút lá có thể được xác định bởi right == left + 1, bạn sẽ có thể để lọc cho điều này sử dụng một F() expression

+7

Nhờ Giải pháp là Category.objects.filter (lft = F ('rght') - 1) – Zed

+3

Zed, Zou nên click vào chấp nhận nút cho câu trả lời này! – Maccesch

+0

Tôi nghĩ rằng điều này đã làm việc cho tôi w/Django 1.4.5 & Django MPTT 0.5.5, nhưng nhận ra nó vẫn còn trở về các nút gốc. Có vẻ như Category.objects.filter (level__gt = 0) là một cách tốt hơn, phải không? – natebeaty

2

giải pháp Unoptimal:

Category.objects.filter(id__in=[category.id for category in Category.objects.all() if category.is_leaf_node()]) 
6
Category.objects.filter(children__isnull=True) 
0

Đoạn mã nhỏ của tôi cho django mptt

từ django.db mô hình nhập

!
class CategoryManager(models.Manager): 
    def get_leaf(self, level=2): 
     return self.filter(level__lte=level).order_by('tree_id','lft').all() 

class Category(models.Model): 
    objects = CategoryManager() 

lợi nhuận, sử dụng nó: Catalog.objects.get_leaf()

Các vấn đề liên quan