2010-01-13 28 views
7

Tôi đang cố sử dụng triển khai Danh mục tương tự cho this one trong Wiki Django. Tôi đang tự hỏi cách Django làm một tìm kiếm để kéo tất cả các đối tượng liên kết với một thể loại cha mẹ. Ví dụ: nếu tôi có danh mục "TV" và có danh mục con "LED", "LCD" và "Plasma", tôi có thể dễ dàng truy vấn tất cả TV mà không cần đệ quy qua tất cả các danh mục phụ và danh mục phụ (nếu có là bất kỳ).Tìm kiếm Danh mục và Tiểu thể loại Django

Mã khôn ngoan Tôi đã suy nghĩ cái gì đó như:

class Item(models.Model): 
    name = ... 
    ... 
    category = models.ForeignKey(Category, null=True, blank=True) 

như vậy với loại hình này thực hiện là có cách nào dễ dàng để làm những gì tôi cần, hoặc là có bất kỳ giải pháp khác tốt hơn?

Cảm ơn bạn!

+0

Các mục có thể nằm trong nhiều danh mục không? – czarchaic

+0

Không, họ chỉ có thể ở trong một danh mục, nhưng sau đó họ cũng sẽ nằm ngoài danh mục gốc (loại giống như thừa kế) –

Trả lời

8

Nếu bạn muốn thực thi các danh mục và danh mục phụ nghiêm ngặt nhưng cũng có khả năng thực hiện tìm kiếm nhanh với kết quả như mô tả, bạn có thể muốn tạo bảng "thẻ" nơi bạn không thực sự cho phép người dùng tự gắn thẻ các mục , nhưng thay vì ngay sau khi bạn chỉ định một danh mục cho một mục bạn điền vào bảng thẻ cho mục đó với tất cả các danh mục gốc đến nút gốc của cây thể loại.

Ví dụ, nếu bạn có điều sau đây: alt text http://img509.yfrog.com/img509/9845/photoho.jpg

Bảng tag sẽ giống như thế:

id | tag_name | tv_id 
    1 |  "tv"  |  1 
    2 |  "sd"  |  1  
    3 |  "crt" |  1 
    4 |  "tv"  |  2 
    5 |  "HD"  |  2 
    6 |  "LCD" |  2 
    7 |  "tv"  |  3 
    8 |  "HD"  |  3 
    9 | "plasma" |  3 

Bây giờ queryset của bạn sẽ trông giống như items=Item.objects.filter(tag='TV')

5

Giả sử bạn đang sử dụng mô hình Category theo cùng một cách nó được sử dụng trên các trang web mà bạn tham chiếu, có vẻ như một loại 'TV' sẽ là một ví dụ Category với một null parent, và 'LCD 'Plasma' & 'sẽ là Category trường hợp có danh mục' TV 'làm cha mẹ.

>>> tv=Category(name="TV") 
>>> tv.save() 
>>> lcd=Category(name="LCD", parent=tv) 
>>> lcd.save() 
>>> plasma=Category(name="Plasma", parent=tv) 
>>> plasma.save() 

Tạo một số mặt hàng

>>> vizio=Item(name="Vizio", category=lcd) 
>>> vizio.save() 
>>> plasmatron=Item(name="PlasmaTron", category=plasma) 
>>> plasmatron.save() 

Nhận Item QuerySet

>>> items=Item.objects.filter(category__parent=tv) 

hoặc

>>>> items=Item.objects.filter(category__parent__name='TV') 

Điều này trông giống như nó ở sân chơi bóng chày của những gì bạn cần?

+0

Điều này có thể thực hiện các danh mục con không? Ví dụ: nếu Vizio thực sự là một danh mục khác và sau đó có một mục như sau: specific_model_number = Mục (name = "model43534", category = vizio) sẽ không "items = Item.objects.filter (category__parent = tv) " không trả về đối tượng specific_model_number trong tập kết quả? –

+0

Bạn có thể chỉnh sửa bài đăng của mình hoặc thêm câu trả lời với loại mã bạn sẽ sử dụng và phác thảo các mối quan ngại của mình không? Tôi đang cố gắng hiểu chính xác những gì bạn cần. Ví dụ trong queryset ở trên, khi lặp qua nó, mỗi mục sẽ có một tên và một 'Category'. Có thể trong ứng dụng của bạn cho một thể loại để có 'vizio' như là một phụ huynh (tức là tiểu mục phụ)? – czarchaic

+0

Có một danh mục có thể có vizio làm cha mẹ. Mối quan tâm của tôi là một queryset sẽ không trả về tất cả các mục trong một tập con của cây thể loại. Nếu tôi đã có một queryset chỉ cho "category__parent = tv" tôi sẽ nhận được tất cả các "vizio" các mặt hàng trả lại mặc dù họ là 2 nút xuống cây? Tôi không biết cách chỉnh sửa bài đăng để giải thích nó tốt hơn vì vậy tôi xin lỗi vì nó gây nhầm lẫn và tôi thực sự đánh giá cao sự giúp đỡ của bạn cho đến nay. –

0

Nếu bạn đang sử dụng django -các loại, sử dụng MPTT sau đó bạn có thể làm như sau:

Entry.objects.filter(category__in=category.get_descendants(True)) 
Các vấn đề liên quan