2013-05-12 17 views
0

我不確定爲此任務設計我的模型的最佳方式。四處搜索表明我需要使用類似Django-MPTT的東西。什麼是正確的方式處理Django模型,在許多類別或子類別

我正在創建一個列表應用程序,其中的任何'項目'可以在多個類別下列出。從任何類別我都需要能夠查詢匹配的「商品」。

一個例子應該說明我想要更好一點。

我有一個Item1將被分配到兩個子類別。

TopLevel1 
    --- Sublevel1 
    --- Sublevel2 
      -----> Item1 

TopLevel1 
    --- Sublevel1 
      ------> Item1 
    --- Sublevel2 

任何人都可以建議如何構建模型/關係?我目前的實施

class Category(models.Model): 
    name = models.CharField(max_length=128, blank=False) 
    parent = models.ForeignKey('self', null=True, blank=True) 


class Item(TimeStampedModel): 
    name = models.TextField(null=False, blank=False) 
    categories = models.ManyToManyField(Category) 

感覺不正確的解決方案?

回答

1

這是我看到它... ...

你的模型似乎接近中,M2M似乎是恰當的,但你的圖看起來更像是:

Item1 
    ---> TopLevel1 (accessed through `categories`) 
     ---> SubLevel1 (accessed through `Category.children`, see below) 
     ---> SubLevel2 (accessed through `Category.children`, see below) 

和你的模型看起來更像

class Category(models.Model): 
    name = models.CharField(max_length=128) # `blank` is false by default 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children') # by giving this field a nice `related_name`, we can easily access the linked categories 

class Item(TimeStampedModel): 
    name = models.TextField() # `null` and `blank` are false by default 
    categories = models.ManyToManyField(Category, null=True, blank=True, related_name='items') 

現在,如果你有一個項目,並希望得到它的頂級類別,可以遍歷item.categories.all()

{% for category in item.categories.all %} 
    Top Level: {{ category.name }} 
{% endfor %} 

和訪問子級類別,您在每個category

{% for category in item.categories.all %} 
    Top Level: {{ category.name }} 
    {% for child in category.children.all %} 
     Sub Level: {{ child.name }} 
     Parent: {{ child.parent.name }} 
    {% endfor %} 
{% endfor %} 

遍歷children.all()你也可以得到所有項目的一個類別

{% for item in category.items.all %} 
    Item: {{ item.name }} 
{% endfor %} 

,或者如果你是在頂級類別

{% for child in category.children.all %} 
    {{ child.name }} 
    {% for item in child.items.all %} 
     Item: {{ item.name }} 
    {% endfor %} 
{% endfor %} 

並與

category_one = Category.objects.create('category one') 
category_two = Category.objects.create('category two') 
item_one = Item.objects.create('item one') 

您可以add一個上Item

item_one.categories.add(category_one, category_two) 

Category通過related managercategories或者你可以addItem通過相關經理itemsCategory

category_one.items.add(item_one) 
+0

優秀的感謝。我會更詳細地閱讀,稍後再嘗試。這看起來正是我想要的。感謝您的詳細回覆。 – 2013-05-13 11:10:36

+0

這似乎正是我想要的。我正在一些測試中對此進行試驗。爲了提高效率,類別模型子類MPTTModel和ForeignKeyField是否應該是TreeForeignKey? – 2013-05-13 21:28:37

+0

@JT不幸的是,我對Django-MPTT一無所知,抱歉... – Ngenator 2013-05-13 21:45:26

相關問題